- 締切済み
C言語の記述について
c言語の記述について教えてください int ia=0x0F0A,ib=0x0F0F,ic; ・iaの上位8ビットを0x00にする記述を書きなさい ic = ia & 0x0f0a ・iaの上位8ビットの上位4ビットを1にする ic = ia | 0xf000 ・iaの値を全て反転する ic =ia^0xffffまたはic = ~ia; という問題なのですが、このような記述の方法でいいのでしょうか?
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- jacta
- ベストアンサー率26% (845/3158)
符号付き整数に対する論理演算は、どうしても処理系に依存します。まずは処理系を明確にしてください。 具体的に何が問題かというと、演算結果が負の0を生成する場合、勝手に通常の0になるかどうかが未規定であること、トラップ表現が生成されると未定義の動作になる場合があることなどが挙げられます。 また、上位4ビットというのも、処理系に依存しない記述は案外難しいのです(難しいというより面倒といった方がよいかも)。というのも、int型が何ビットの精度を持つのかは、INT_MAXを頼りに導かないといけませんので(詰め物ビットに配慮しないといけないので、sizeof(int)*CHAR_BITとはできない)、ちょっと手間がかかります。 さらに、「上位4ビット」いうのが、符号ビットを含めるのかどうかも質問内容からは断定できません。これについても補足願います。
- MrBan
- ベストアンサー率53% (331/615)
定石としては、下位4bitをMASK=0x000Fで表したとして、 (他を変えずに)下位4bitを全部1にするのは A |= MASK (他を変えずに)下位4bitを全部0にするのは A &= ~MASK ic = ia(:0x0f0a) & 0x0f0aは「上位8ビットを0x00にする」記述ですか? # ・ここではintが16bitの前提ですか。 # ・基本的にビット演算はunsignedやることを推奨しておきます。 # ・全般的に「iaを~にする」問題に対して、コードはicに結果を入れていますが、 # "ia |= ..." 等でなくてもいいのでしょうか。 # 「iaを~にしたものをicに代入する」問題と読み替えてOKですか。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
0とANDして0にする 1とOR して1にする 1とXORして反転する と覚えておくといい。 なので、 特定のbitを0にするには、そこを0そこ以外を1にしたパターンとAND 特定のbitを1にするには、そこを1そこ以外を0にしたパターンとOR