32位无符号整数反转位的位移实现逻辑及效率优势疑问
位反转位移方案原理解析
位移操作实现位反转的核心逻辑
首先你对移位的基础理解是对的:整数的左移<<、右移>>本质就是直接操作二进制位,对无符号整数来说,左移1位等价于乘2,右移1位等价于整除2,这个特性刚好可以用来实现位反转。
我们可以拆解位移方案的每一步循环逻辑,你就能明白原理:
- 初始时
result设为0,用来存储反转后的结果 - 每次循环做三件事:
- 把
result左移1位:相当于把已经存到result里的所有二进制位统一往高位挪1位,空出最低位用来放新的位 - 用
n & 1取出n当前的最低位,如果是1就给result的最低位加1,相当于把n的最低位放到了result刚空出来的最低位上 - 把
n右移1位:把n的次低位变成新的最低位,方便下一次循环取
- 把
- 循环32次之后,刚好把原n从最低位到最高位的所有位,按顺序放到了result从最低位到最高位的位置,相当于原n的位整体反转。
举个简化的4位整数例子更直观:比如原n是1011(十进制11),要反转得到1101(十进制13):
循环1:result=0<<1=0,取n最低位1→result=1,n右移为
101
循环2:result=1<<1=10,取n最低位1→result=11,n右移为10
循环3:result=11<<1=110,取n最低位0→result=110,n右移为1
循环4:result=110<<1=1100,取n最低位1→result=1101,n右移为0
最终结果刚好是反转后的二进制数,逻辑完全成立。
位移方案效率更高的原因
空间效率差异
你的字符串拼接方案需要生成一个长度为32的字符串对象,而且Python中字符串是不可变类型,每次执行binary = binary + str(n%2)都会生成新的临时字符串对象,额外占用内存。而位移方案全程只用到result和n两个整数变量,没有额外的内存开销,常数空间的占用远低于字符串方案。
时间效率差异
位移、位与操作都是CPU直接支持的底层指令,单时钟周期就能执行完成,整个循环没有额外的函数调用开销。而字符串方案涉及str()类型转换、字符串拼接、int(字符串,2)转换三个重开销操作,每一步都要经过Python解释器的类型检查、内存分配等大量额外逻辑,即使都是32次循环,单次循环的耗时是位移方案的数倍甚至数十倍。
内容的提问来源于stack exchange,提问作者QUEEN
相关产品推荐
相关产品推荐

