仅按位操作即可反转(翻转)数字的最后n位

时间:2019-01-05 23:45:45

标签: c++ c bitwise-operators

给出一个二进制整数,如何在c / c ++中仅使用按位运算来反转(翻转)最后n位?
例如:

// flip last 2 bits
0110 -> 0101
0011 -> 0000
1000 -> 1011

1 个答案:

答案 0 :(得分:5)

您可以使用翻转数字的最后n位

#define flipBits(n,b) ((n)^((1u<<(b))-1))

例如flipBits(0x32, 4)将翻转最后4位,结果将是0x3d


之所以可行,是因为如果您认为异或的工作原理

 0 ^ 0 => 0
 1 ^ 0 => 1

没有 翻转

0 ^ 1 => 1
1 ^ 1 => 0

被翻转


 (1<<b)-1

这部分为您提供最后n位 例如,如果b是4,那么1<<40b10000,如果我们删除1,我们得到的掩码是0b1111,那么我们可以使用它与数字进行异或运算以获得所需的输出

适用于C和C ++