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

二进制数反转位技巧代码解析及位运算逻辑疑问咨询

解惑:按位或(|)为何没有短路特性

嘿,我发现你这里的核心误解是把**逻辑或运算符||和按位或运算符|**搞混啦!这俩虽然长得像,但功能完全不一样,|根本不存在“短路求值”的特性——不管左边表达式的结果是什么,它都会先计算左右两边的值,再对两个值的每一位执行按位或操作。

先明确两个运算符的区别:

  • 逻辑或||:用于布尔判断,只要左边表达式的结果为“真”(非0),就会直接返回真,不会执行右边的表达式(短路逻辑),比如if (a || b),如果a为真,b就不会被执行。
  • 按位或|:是对两个整数的二进制每一位进行或运算,规则是只要对应位有一个为1,结果位就是1。它必须先计算出左右两个操作数的完整值,再逐位运算,不存在短路。

结合你的代码和输入n=9的情况一步步拆解:

n=9的二进制是00001001,初始rev=0,k=9。

  1. 第一次循环:

    • rev << 1 → 0左移1位还是0(00000000)
    • k & 1 → 9的二进制最后一位是1,所以结果是1(00000001)
    • 按位或:0 | 1 = 1 → rev更新为1(00000001)
    • k >> 1 → 9右移1位变成4(00000100),对应你看到的第一行输出。
  2. 第二次循环:

    • rev << 1 → 1左移1位是2(00000010)
    • k & 1 → 4的最后一位是0,结果是0(00000000)
    • 按位或:2 | 0 = 2 → rev更新为2(00000010)
    • k >> 1 →4右移1位变成2(00000010),对应第二行输出。
  3. 第三次循环:

    • rev << 1 →2左移1位是4(00000100)
    • k & 1 →2的最后一位是0,结果是0(00000000)
    • 按位或:4 | 0 =4 →rev更新为4(00000100)
    • k >>1 →2右移1位变成1(00000001),对应第三行输出。
  4. 第四次循环:

    • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:04:50