C 清除低16位

C 清除低16位,c,bit-manipulation,bitwise-operators,C,Bit Manipulation,Bitwise Operators,我对逐位运算符不太在行,所以请原谅我的问题,但我如何清除C/C++中32位整数的低16位 例如,我有一个整数:0x12345678,我想将其设置为:0x12340000要清除任何特定的位集,可以使用按位and和在这些位置有1的数字的补码。在您的情况下,由于数字0xFFFF设置了较低的16位,您可以使用其补码和: b &= ~0xFFFF; // Clear lower 16 bits. 如果要设置这些位,可以使用按位或设置了这些位的数字: b |= 0xFFFF; // Set low

我对逐位运算符不太在行,所以请原谅我的问题,但我如何清除C/C++中32位整数的低16位


例如,我有一个整数:0x12345678,我想将其设置为:0x12340000

要清除任何特定的位集,可以使用按位and和在这些位置有1的数字的补码。在您的情况下,由于数字0xFFFF设置了较低的16位,您可以使用其补码和:

b &= ~0xFFFF; // Clear lower 16 bits.
如果要设置这些位,可以使用按位或设置了这些位的数字:

b |= 0xFFFF; // Set lower 16 bits.
b ^= 0xFFFF; // Flip lower 16 bits.
而且,如果您想翻转这些位,可以使用设置了这些位的数字的按位异或:

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

希望这有帮助

一种方法是按位使用0xFFFF0000,例如,
value=value&0xFFFF0000

使用AND(
&
)和掩码,掩码由前16位的全1(保留前几位的原样)和后几位的全0(消除数字的下几位)组成

就这样吧

0x12345678 & 0xffff0000
如果类型的大小未知,并且您只想屏蔽较低的16位,那么您也可以用另一种方式构建掩码:使用只允许较低的16位通过的掩码

0xffff
并使用按位not(
~
)将其反转,这样它将成为仅杀死较低16位的掩码:

0x12345678 & ~0xffff
b &= -0x10000;

要走另一条路,你可以试试

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

x=((x>>16)假设要从中清除位的值具有非“小秩”的无符号类型,这是清除低16位的最安全、最方便的方法:

0x12345678 & ~0xffff
b &= -0x10000;
-0x10000
将通过模运算提升为
b
(无符号类型),从而设置所有高位,低位16位为零


编辑:事实上,詹姆斯的答案是最安全的(最广泛的用例)当然,但他的答案和我的答案对其他类似问题的概括方式有点不同,我的答案可能更适用于相关问题。

如果我没有弄错的话,这实际上很好,因为它也适用于16位和64位值。@James-如果你尝试在非32位机器上执行类似于
b&0xFFFF0000
的操作(例如,64位机器),则这可能会意外地清除低32位之外的高32位。它不适用于64位值。
0xffff
具有type
int
,即使
b
具有type
unsigned long
或诸如此类,在现实系统中几乎肯定是32位。
~0xffff
也具有实现定义由于
0xffff
具有签名类型,因此执行了ed行为。有关更好的方法,请参阅我的答案。如果0x12345678和我想这样做,请告诉我:0x00005678,或者我应该打开另一个问题吗?为什么不执行类似
b&=~(1?0xffff:b);