32位位反转代码调整x左移语句位置结果不同的原因是什么
位反转代码顺序差异的底层原因
我们可以通过执行逻辑和实例模拟来明确两个版本的差异:
核心执行时序差异
两个版本的唯一区别是x = x << 1和最低位赋值操作的先后顺序,这个差异直接导致了结果不同:
错误版本执行顺序(每轮循环)
- 检查
n的最低位,若为1则给x加1 - 将
x整体左移1位 - 将
n整体右移1位
正确版本执行顺序(每轮循环)
- 先将
x整体左移1位,给新的位腾出最低位的空位 - 检查
n的最低位,若为1则填入x刚腾出来的最低位 - 将
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
相关产品推荐
相关产品推荐

