清除低16位

时间:2011-07-29 00:52:22

标签: c bit-manipulation bitwise-operators

对于按位运算符我不是很好所以请原谅这个问题,但是如何清除C / C ++中32位整数的低16位?

例如,我有一个整数:0x12345678,我想这样做:0x12340000

6 个答案:

答案 0 :(得分:15)

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

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

如果你想设置这些位,你可以改为使用带有这些位设置的数字的按位OR:

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

而且,如果你想翻转这些位,你可以使用带有这些位设置的数字的按位异或:

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

希望这有帮助!

答案 1 :(得分:4)

要采取另一条路径,您可以尝试

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

答案 2 :(得分:2)

一种方法是按位AND与0xFFFF0000,例如value = value & 0xFFFF0000

答案 3 :(得分:1)

使用&),其掩码由前16位全部组成(将保留最高位)并且底部位全部为零(这会杀死数字的底部位。)

所以它会

0x12345678 & 0xffff0000

如果类型的大小未知并且您只想掩盖低16位,您还可以用另一种方式构建掩码:使用一个只允许低16位的掩码

0xffff

并使用按位而不是{~)将其反转,因此它将成为仅删除低16位的掩码:

0x12345678 & ~0xffff

答案 4 :(得分:1)

int x = 0x12345678;
int mask = 0xffff0000;

x &= mask;

答案 5 :(得分:1)

假设要清除位的值有无符号类型而不是“小等级”,这是清除低16位的最安全,最便携的方式:

b &= -0x10000;

-0x10000将通过模运算提升为b类型(无符号类型),从而导致所有高位都被置位,低16位为零。

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