如何交换位掩码中从右往左数第1位与第2位的比特位?
交换二进制数从右往左数第1、2位比特位的实现方法
先结合你的输入输出明确:这里的「从右往左数第1位」对应二进制的2¹位(即右数第2个比特,0-based编号为1),「第2位」对应2²位(右数第3个比特,0-based编号为2)。
问题示例
| 输入(二进制) | 输出(二进制) |
|---|---|
| 1010 | 1100 |
| 1110 | 1110 |
| 0101 | 0011 |
简化实现思路
你已经找对了提取目标比特的方向,但步骤可以大幅简化。核心逻辑是:提取两个目标比特并交换位置,清零原数的这两位,最后将移位后的比特与清零后的原数合并。
通用实现步骤
- 提取并交换比特位置:
- 提取右数第1位(2¹位):
num & 0b0010,左移1位放到2²位的位置:(num & 0b0010) << 1 - 提取右数第2位(2²位):
num & 0b0100,右移1位放到2¹位的位置:(num & 0b0100) >> 1
- 提取右数第1位(2¹位):
- 清零原数的目标位:用掩码
~0b0110(保留除2¹、2²位外的所有位)与原数按位与:num & ~0b0110 - 合并结果:将清零后的数和移位后的两个比特按位或,得到最终结果。
代码示例(以Python为例)
def swap_bits(num): # 提取右数第1位并移到2^2位 bit1 = (num & 0b0010) << 1 # 提取右数第2位并移到2^1位 bit2 = (num & 0b0100) >> 1 # 清零原数的两个目标比特位 cleared_num = num & ~0b0110 # 合并得到结果 return cleared_num | bit1 | bit2
测试示例:
- 输入
0b1010(十进制10):结果为0b1100,符合输出 - 输入
0b1110(十进制14):结果为0b1110,符合输出 - 输入
0b0101(十进制5):结果为0b0011,符合输出
更高效的技巧
如果两个目标比特值不同,直接对这两位异或0b0110就能完成交换(01和10异或11后会互相转换);如果值相同,异或后结果不变。可以用一行代码实现:
def swap_bits(num): # 两位不同则翻转,相同则返回原数 return num ^ 0b0110 if ((num >> 1) & 1) != ((num >> 2) & 1) else num
内容的提问来源于stack exchange,提问作者Daniela Morais
相关产品推荐
相关产品推荐

