• 締切済み

シフト演算について教えてください

関数の結果が以下のEparamErr だったときに、EnumDstInstrの値を付与させたいのですが、シフト演算がわからず、苦戦しています。 以下のコードで、前半の8ビットシフトはどういうことを指しているのでしょうか。 retはORの結果が入ることはわかるのですが・・・・ 後半の0x0000FF00との計算は、8ビットシフトの結果とのANDの結果ですよね・・・ --------------------------------------------------------------------- [ヘッダ] int EparamErr = -11; enum EnumDstInstr { enum1 = 1, enum2 }; ・・・ [コード] ・・・ ret |= (((int)EnumDstInstr.enum1 << 8) & 0x0000FF00) --------------------------------------------------------------------- よろしくお願い致します。

みんなの回答

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.1

どういった用途でそういったコードにしてるのかは 書かれてるコードだけではわかりかねますが 処理としては EnumDstInstr.enum1 は1ですから EnumDstInstr.enum1 << 8 で 0x0100(10進の256) になります (その意味では <<8 は *256 と同じです) それに 0x0000FF00 をandしてるので結果としては同じ 0x0100 それを元々のretの値とorしてるだけです 仮に元々 retにEparamErr (負の値)が代入されていたのなら (処理系にもよるので)intが何バイトかわかりませんが負の値なので 下位1バイトは0xF5 その上位バイトは0xFF(ビットならオール1)となります その値に対して 0x100 を or することになり (見た目の)結果としていえば EparamErr (元の負の値)そのままと変わりません retに整数がセットされていた場合には値が変化してきます (特に2バイト目の値に大きく依存)

関連するQ&A

専門家に質問してみよう