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

求解析Codefights上简洁的mirrorBits位反转代码逻辑

解析简洁的二进制位反转函数 mirrorBits

嘿,我完全懂你看到这段短短几行的代码却摸不着头脑的感觉——毕竟自己写了30行,突然看到这么优雅的实现肯定会好奇它到底怎么运作的!咱们一步步拆解这段代码,把它的逻辑掰碎了说清楚。

先把这段神奇的代码贴出来:

int mirrorBits(int a) {
    int r = 0;
    for (; a; a >>= 1)
        r = r << 1 | a & 1;
    return r;
}

核心变量说明

  • a:你输入的整数,我们要反转它的二进制位
  • r:结果存储变量,初始化为0,用来一步步攒出反转后的二进制值

循环逻辑拆解

这个for循环看起来有点特殊——它没有初始化语句,直接用a作为循环条件,每次循环结束执行a >>= 1:

  • 循环条件a:只要a不等于0,就继续循环(意思是只要a还有二进制位没处理完,就接着干)
  • a >>= 1:把a的二进制位整体右移1位,相当于把最右边的那一位“扔掉”,让下一位变成新的最低位

最关键的循环体:r = r << 1 | a & 1

这行是整个函数的灵魂,咱们拆成3个小步骤看:

  1. a & 1:提取a的最低位
    二进制里,1的表示是...0001,和a做按位与操作后,只会保留a最右边的那一位,其他位都变成0。比如a=8(二进制1000)时,a&1的结果就是0;当a右移到1(二进制0001)时,a&1的结果就是1。
  2. r << 1:给新位腾位置
    把当前r的二进制位整体左移1位,相当于在r的最右边空出一个位置,用来放刚提取到的a的最低位。比如r=0时左移1位还是0;如果r=1(二进制0001),左移后就变成0010。
  3. |(按位或):合并结果
    把左移后的r和提取到的最低位做按位或,就把新的位放到了r的最右边,完成一次“位反转”的累加。

用输入a=8的例子走一遍流程

初始状态:a=8(二进制1000),r=0(二进制0000)

  1. 第一次循环:
    • a&1 = 1000 & 0001 = 0
    • r<<1 = 0000 <<1 = 0000
    • r = 0000 | 0 = 0
    • a >>=1 → a=4(二进制0100)
  2. 第二次循环:
    • a&1 = 0100 & 0001 =0
    • r<<1 = 0000 <<1 =0000
    • r=0|0=0
    • a>>=1 → a=2(二进制0010)
  3. 第三次循环:
    • a&1 = 0010 &0001=0
    • r<<1=0000<<1=0000
    • r=0|0=0
    • a>>=1 → a=1(二进制0001)
  4. 第四次循环:
    • a&1 = 0001&0001=1
    • r<<1=0000<<1=0000
    • r=0000 |1=1(二进制0001)
    • a>>=1 → a=0,循环结束

最后返回r=1,正好和你说的输入8输出1的结果一致!

总结一下

这段代码的核心思路就是逐位“抠”出输入数的最低位,然后把它放到结果数的最低位(通过左移结果腾位置+按位或合并),同时不断把输入数右移,直到所有位都处理完毕。用最少的代码实现了二进制位反转,确实是相当优雅的写法!

内容的提问来源于stack exchange,提问作者elessar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:49:41