2011-07-29 65 views
6

我對位運算符不太擅長,所以請原諒這個問題,但是如何清除C/C++中32位整數的低16位?清除低位16位

比如我有一個整數:0×12345678和我想要的是:0x12340000

回答

13

要清除任何特定位,可以使用按位與多家有那些地方的1的補碼。在你的情況,自號爲0xFFFF有低16位設置,你可以和它的補:

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

如果你想設置那些位,你也可以使用按位或用數字,設立這些位:

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

而且,如果你想翻轉那些位,你可以使用按位異或擁有一批具有這些位設置:

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

希望這有助於!

+0

這實際上是很好的,因爲它也適用於16位和64位值,如果我沒有弄錯的話。 –

+0

@射線 - 爲什麼不呢? – James

+0

@ James-如果您在非32位機器(例如64位機器)上嘗試做類似'b&0xFFFF0000'的操作,那麼除了低32位外,這可能會意外地最終清除高32位位。 – templatetypedef

2

一種方法是將其與0xFFFF0000(例如, value = value & 0xFFFF0000

1

使用&)與由前16位全1(將假頂位,因爲它們)和下位全部爲零的面具(能殺死底位的數量)。

因此這將是

0x12345678 & 0xffff0000 

如果該類型的大小是不知道,你想屏蔽掉僅低16位,你也可以建立面膜以另一種方式:使用口罩這將讓通過只低16位

0xffff 

,並與按位不(~)倒轉,所以它會成爲殺死只有較低的16位掩碼:

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

x &= mask; 
4

要採取另一種路徑,你可以嘗試

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

假設要清除位從有一個無符號類型不是「小級別」的價值,這是最安全,最簡便的方式以清除低16位:

b &= -0x10000; 

-0x10000將被提升爲的b由模運算的類型(無符號類型),導致所有高位被設置並且低16位是零。其實詹姆斯的答案是最安全的(最廣泛的用例),但他的回答和我對其他類似問題的推廣方式有點不同,我的方法可能更適用於相關問題。

+0

爲什麼不做'b&=〜(1?0xFFFF:b);'? –