求解析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个小步骤看:
a & 1:提取a的最低位
二进制里,1的表示是...0001,和a做按位与操作后,只会保留a最右边的那一位,其他位都变成0。比如a=8(二进制1000)时,a&1的结果就是0;当a右移到1(二进制0001)时,a&1的结果就是1。r << 1:给新位腾位置
把当前r的二进制位整体左移1位,相当于在r的最右边空出一个位置,用来放刚提取到的a的最低位。比如r=0时左移1位还是0;如果r=1(二进制0001),左移后就变成0010。|(按位或):合并结果
把左移后的r和提取到的最低位做按位或,就把新的位放到了r的最右边,完成一次“位反转”的累加。
用输入a=8的例子走一遍流程
初始状态:a=8(二进制1000),r=0(二进制0000)
- 第一次循环:
a&1=1000 & 0001= 0r<<1=0000 <<1= 0000r = 0000 | 0= 0a >>=1→a=4(二进制0100)
- 第二次循环:
a&1=0100 & 0001=0r<<1= 0000 <<1 =0000r=0|0=0a>>=1→a=2(二进制0010)
- 第三次循环:
a&1=0010 &0001=0r<<1=0000<<1=0000r=0|0=0a>>=1→a=1(二进制0001)
- 第四次循环:
a&1=0001&0001=1r<<1=0000<<1=0000r=0000 |1=1(二进制0001)a>>=1→a=0,循环结束
最后返回r=1,正好和你说的输入8输出1的结果一致!
总结一下
这段代码的核心思路就是逐位“抠”出输入数的最低位,然后把它放到结果数的最低位(通过左移结果腾位置+按位或合并),同时不断把输入数右移,直到所有位都处理完毕。用最少的代码实现了二进制位反转,确实是相当优雅的写法!
内容的提问来源于stack exchange,提问作者elessar
相关产品推荐
相关产品推荐

