私はビット演算子ではあまり良くありませんので、疑問を言い訳してください。しかし、C/C++で32ビット整数の下位16ビットをクリアするにはどうしたらいいですか?例えば下位16ビットをクリア
私は整数を持っている:0x12345678のと私はそれを作りたい:0x12340000
私はビット演算子ではあまり良くありませんので、疑問を言い訳してください。しかし、C/C++で32ビット整数の下位16ビットをクリアするにはどうしたらいいですか?例えば下位16ビットをクリア
私は整数を持っている:0x12345678のと私はそれを作りたい:0x12340000
は、ビットの任意の特定のセットをクリアするには、あなたはビット単位を使用し、それらの場所で1秒を持っている数の補数にすることができます。あなたのケースでは、数以来、0xFFFFでは、その下位16ビットが設定されている、あなたができ、その補数で:あなたはしたい場合これらのビットを設定
b &= ~0xFFFF; // Clear lower 16 bits.
、あなたの代わりに番号のビットごとのORを使用することができることをこれらのビットは設定しました:
b |= 0xFFFF; // Set lower 16 bits.
そして、あなたはフリップこれらのビットに望んでいた場合、あなたが設定され、これらのビットを有する数をビット単位のXORを使用することができます。
b ^= 0xFFFF; // Flip lower 16 bits.
これが役に立ちます。
1つの方法は、0xFFFF0000とビット単位でANDすることです。 value = value & 0xFFFF0000
使用と上位16ビットすべてのもの(そのままそれがトップビットを残す)と底ビットすべてゼロで構成されているマスクを(&
)(すなわち底ビットを殺します番号の)。
種類のサイズが知られており、あなたはまた、別の方法でマスクを構築することができる唯一の下位16ビットをマスクしたいされていない場合、それは
0x12345678 & 0xffff0000
なりますので:マスクを使用それは、下位16ビット
0xffff
を通過させ、それががだけ下位16ビット殺すマスクとなるであろうように、ビット単位ではない(~
)でそれを反転します:
0x12345678 & ~0xffff
int x = 0x12345678;
int mask = 0xffff0000;
x &= mask;
別のパスを取るために、あなたは、これが最も安全な、最も移植可能な方法で、あなたがいない「小さなランク」のunsigned型を持っているからビットをクリアしたい値を仮定し
x = ((x >> 16) << 16);
を試すことができます
b &= -0x10000;
値-0x10000
全て、その結果、剰余演算によってb
のタイプ(unsigned型)に昇格されます。下位16ビットをクリアします上位ビットはセットされ、下位16ビットはゼロである。
編集:実際にジェームズの答えはすべての中で最も安全な(最も広範なユースケース)ですが、彼の答えや鉱山は他の同様の問題に一般化する方法は少し異なり、関連する問題にもっと応用できるかもしれません。
'b&=〜(1?0xFFFF:b);'のようなことをしないのはなぜですか? –
私が間違っていなければ、16ビットと64ビットの値でも動作するので、これは実際にはいいです。 –
@レイ - それはなぜでしょうか? – James
@ James-非32ビットマシン(たとえば、64ビットマシン)で 'b&0xFFFF0000'のようなことをしようとすると、誤って32ビットに加えて上位32ビットがクリアされることがありますビット。 – templatetypedef