2011-07-29 6 views
6

私はビット演算子ではあまり良くありませんので、疑問を言い訳してください。しかし、C/C++で32ビット整数の下位16ビットをクリアするにはどうしたらいいですか?例えば下位16ビットをクリア

私は整数を持っている:0x12345678のと私はそれを作りたい:0x12340000

答えて

13

は、ビットの任意の特定のセットをクリアするには、あなたはビット単位を使用し、それらの場所で1秒を持っている数の補数にすることができます。あなたのケースでは、数以来、0xFFFFでは、その下位16ビットが設定されている、あなたができ、その補数で:あなたはしたい場合これらのビットを設定

b &= ~0xFFFF; // Clear lower 16 bits. 

、あなたの代わりに番号のビットごとのORを使用することができることをこれらのビットは設定しました:

b |= 0xFFFF; // Set lower 16 bits. 

そして、あなたはフリップこれらのビットに望んでいた場合、あなたが設定され、これらのビットを有する数をビット単位のXORを使用することができます。

b ^= 0xFFFF; // Flip lower 16 bits. 

これが役に立ちます。

+0

私が間違っていなければ、16ビットと64ビットの値でも動作するので、これは実際にはいいです。 –

+0

@レイ - それはなぜでしょうか? – James

+0

@ James-非32ビットマシン(たとえば、64ビットマシン)で 'b&0xFFFF0000'のようなことをしようとすると、誤って32ビットに加えて上位32ビットがクリアされることがありますビット。 – templatetypedef

2

1つの方法は、0xFFFF0000とビット単位でANDすることです。 value = value & 0xFFFF0000

1

使用と上位16ビットすべてのもの(そのままそれがトップビットを残す)と底ビットすべてゼロで構成されているマスクを&)(すなわち底ビットを殺します番号の)。

種類のサイズが知られており、あなたはまた、別の方法でマスクを構築することができる唯一の下位16ビットをマスクしたいされていない場合、それは

0x12345678 & 0xffff0000 

なりますので:マスクを使用それは、下位16ビット

0xffff 

を通過させ、それがだけ下位16ビット殺すマスクとなるであろうように、ビット単位ではない(~)でそれを反転します:

0x12345678 & ~0xffff 
1
int x = 0x12345678; 
int mask = 0xffff0000; 

x &= mask; 
4

別のパスを取るために、あなたは、これが最も安全な、最も移植可能な方法で、あなたがいない「小さなランク」のunsigned型を持っているからビットをクリアしたい値を仮定し

x = ((x >> 16) << 16); 
1

を試すことができます

b &= -0x10000; 

-0x10000全て、その結果、剰余演算によってbのタイプ(unsigned型)に昇格されます。下位16ビットをクリアします上位ビットはセットされ、下位16ビットはゼロである。

編集:実際にジェームズの答えはすべての中で最も安全な(最も広範なユースケース)ですが、彼の答えや鉱山は他の同様の問題に一般化する方法は少し異なり、関連する問題にもっと応用できるかもしれません。

+0

'b&=〜(1?0xFFFF:b);'のようなことをしないのはなぜですか? –