对于按位运算符我不是很好所以请原谅这个问题,但是如何清除C / C ++中32位整数的低16位?
例如,我有一个整数:0x12345678,我想这样做:0x12340000
答案 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位为零。
编辑:实际上,詹姆斯的回答是最安全的(最广泛的用例),但他的答案和我对其他类似问题的概括有点不同,我的回答可能更适用于相关问题。