みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

関数の結果が以下のEparamErr だったときに、EnumDstInstrの値を付与させたいのですが、シフト演算がわからず、苦戦しています。
以下のコードで、前半の8ビットシフトはどういうことを指しているのでしょうか。

retはORの結果が入ることはわかるのですが・・・・
後半の0x0000FF00との計算は、8ビットシフトの結果とのANDの結果ですよね・・・
---------------------------------------------------------------------
[ヘッダ]
int EparamErr = -11;

enum EnumDstInstr
{
enum1 = 1,
enum2
};
・・・

[コード]
・・・
ret |= (((int)EnumDstInstr.enum1 << 8) & 0x0000FF00)
---------------------------------------------------------------------
よろしくお願い致します。

投稿日時 - 2015-04-09 00:08:59

QNo.8952096

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.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バイト目の値に大きく依存)

投稿日時 - 2015-04-09 22:45:58

あなたにオススメの質問