You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何交换位掩码中从右往左数第1位与第2位的比特位?

交换二进制数从右往左数第1、2位比特位的实现方法

先结合你的输入输出明确:这里的「从右往左数第1位」对应二进制的2¹位(即右数第2个比特,0-based编号为1),「第2位」对应2²位(右数第3个比特,0-based编号为2)。

问题示例

输入(二进制)输出(二进制)
10101100
11101110
01010011

简化实现思路

你已经找对了提取目标比特的方向,但步骤可以大幅简化。核心逻辑是:提取两个目标比特并交换位置,清零原数的这两位,最后将移位后的比特与清零后的原数合并。

通用实现步骤

  1. 提取并交换比特位置:
    • 提取右数第1位(2¹位):num & 0b0010,左移1位放到2²位的位置:(num & 0b0010) << 1
    • 提取右数第2位(2²位):num & 0b0100,右移1位放到2¹位的位置:(num & 0b0100) >> 1
  2. 清零原数的目标位:用掩码~0b0110(保留除2¹、2²位外的所有位)与原数按位与:num & ~0b0110
  3. 合并结果:将清零后的数和移位后的两个比特按位或,得到最终结果。

代码示例(以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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:43:19