二进制数反转位技巧代码解析及位运算逻辑疑问咨询
解惑:按位或(
|)为何没有短路特性 嘿,我发现你这里的核心误解是把**逻辑或运算符||和按位或运算符|**搞混啦!这俩虽然长得像,但功能完全不一样,|根本不存在“短路求值”的特性——不管左边表达式的结果是什么,它都会先计算左右两边的值,再对两个值的每一位执行按位或操作。
先明确两个运算符的区别:
- 逻辑或
||:用于布尔判断,只要左边表达式的结果为“真”(非0),就会直接返回真,不会执行右边的表达式(短路逻辑),比如if (a || b),如果a为真,b就不会被执行。 - 按位或
|:是对两个整数的二进制每一位进行或运算,规则是只要对应位有一个为1,结果位就是1。它必须先计算出左右两个操作数的完整值,再逐位运算,不存在短路。
结合你的代码和输入n=9的情况一步步拆解:
n=9的二进制是00001001,初始rev=0,k=9。
第一次循环:
rev << 1→ 0左移1位还是0(00000000)k & 1→ 9的二进制最后一位是1,所以结果是1(00000001)- 按位或:
0 | 1 = 1→rev更新为1(00000001) k >> 1→ 9右移1位变成4(00000100),对应你看到的第一行输出。
第二次循环:
rev << 1→ 1左移1位是2(00000010)k & 1→ 4的最后一位是0,结果是0(00000000)- 按位或:
2 | 0 = 2→rev更新为2(00000010) k >> 1→4右移1位变成2(00000010),对应第二行输出。
第三次循环:
rev << 1→2左移1位是4(00000100)k & 1→2的最后一位是0,结果是0(00000000)- 按位或:
4 | 0 =4→rev更新为4(00000100) k >>1→2右移1位变成1(00000001),对应第三行输出。
第四次循环:
rev <<1→4左移1位是8(00001000)k &1→1的最后一位是1,结果是1(00000001)- 按位或:
8 |1=9→rev更新为9(00001001) k >>1→1右移1位变成0,循环结束。
你看,每一次循环里(rev <<1)和(k&1)都会被计算,然后通过按位或把k的最后一位“拼”到rev的末尾,这才实现了二进制反转的效果。
内容的提问来源于stack exchange,提问作者Tanmay Jha
相关产品推荐
相关产品推荐

