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

32位位反转代码调整x左移语句位置结果不同的原因是什么

位反转代码顺序差异的底层原因

我们可以通过执行逻辑和实例模拟来明确两个版本的差异:

核心执行时序差异

两个版本的唯一区别是x = x << 1和最低位赋值操作的先后顺序,这个差异直接导致了结果不同:

错误版本执行顺序(每轮循环)

  1. 检查n的最低位,若为1则给x加1
  2. 将x整体左移1位
  3. 将n整体右移1位

正确版本执行顺序(每轮循环)

  1. 先将x整体左移1位,给新的位腾出最低位的空位
  2. 检查n的最低位,若为1则填入x刚腾出来的最低位
  3. 将n整体右移1位

实例模拟验证

我们用简化的4位位反转场景举例,要反转的数n = 0b1001(十进制9),正确反转结果应该也是0b1001:

错误版本运行过程

初始值:x=0,n=0b1001,循环次数4次
第1轮:n最低位为1 → x=1 → x左移为0b10 → n右移为0b100
第2轮:n最低位为0 → x不变 → x左移为0b100 → n右移为0b10
第3轮:n最低位为0 → x不变 → x左移为0b1000 → n右移为0b1
第4轮:n最低位为1 → x=0b1001 → x左移为0b10010 → n右移为0
最终x取低4位为0b0010,和预期结果不符

错误版本最后一次循环给x赋值后,又多执行了一次左移,把原数最高位的1移到了第5位(32位场景下就是移到第33位,被uint32_t类型直接截断丢弃),最终结果相当于正确结果左移1位,最低位多了个无效的0,且丢失了原数的最高位。

正确版本运行过程

初始值:x=0,n=0b1001,循环次数4次
第1轮:x左移为0 → n最低位为1 → x=1 → n右移为0b100
第2轮:x左移为0b10 → n最低位为0 → x不变 → n右移为0b10
第3轮:x左移为0b100 → n最低位为0 → x不变 → n右移为0b1
第4轮:x左移为0b1000 → n最低位为1 → x=0b1001 → n右移为0
最终x为0b1001,和预期结果一致

正确版本每次先腾位置再填值,32次循环刚好把原数的32位依次填入x的对应位置,没有多余的移位操作,所有位都能完整保留。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 17:36:03