首页 > 解决方案 > 仅使用按位运算反转(翻转)数字的最后 n 位

问题描述

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

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

标签: c++cbitwise-operators

解决方案


您可以使用翻转号码的最后 n 位

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

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


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

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

翻转

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

翻转


 (1<<b)-1

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

适用于 C 和 C++


推荐阅读