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

Muh*_*tih 2 c c++ bitwise-operators

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

// flip last 2 bits
0110 -> 0101
0011 -> 0000
1000 -> 1011
Run Code Online (Sandbox Code Playgroud)

小智 5

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

#define flipBits(n,b) ((n)^((1u<<(b))-1))
Run Code Online (Sandbox Code Playgroud)

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


这是有效的,因为如果您认为XOR如何工作

 0 ^ 0 => 0
 1 ^ 0 => 1
Run Code Online (Sandbox Code Playgroud)

没有被翻转

0 ^ 1 => 1
1 ^ 1 => 0
Run Code Online (Sandbox Code Playgroud)

翻转


 (1<<b)-1
Run Code Online (Sandbox Code Playgroud)

这部分可以让你的最后n位,例如,如果b为4,然后1<<4就是0b10000,如果我们去掉1,我们得到我们的面具被0b1111那么我们就可以用这个与我们的数异或,以获得所需的输出.

适用于C和C++

  • 如果`b`是`int`中的位数或者小于1的位数,那么`1 << b`的行为不是由C标准定义的.(如果它少一个,则行为未定义,因为值溢出.如果它等于宽度,则不定义它,因为移位运算符限制为小于整个宽度的移位.) (5认同)
  • 如果您将define表达式放在括号之间,可以是一个可接受的答案,以避免预处理优先级的问题.使用内联函数或模板函数会更好. (4认同)
  • 最好使用`1u <<(b)`而不是`1 <<(b)` (2认同)