左移与右移
左移
无论被移动的数是有符号还是无符号,左移一位相当于乘2(在不溢出的情形下)
右移
对于无符号数,右移一位相当于除以2;
对于有符号数,如果还想获得同样右移除以2的效果,就要考虑算数右移,即符号位始终不变,所有位(包括符号位)都向右移动一位,这样造成的结果就是,整数通过算数右移,最终都会等于0(所有bit都是0),负数通过算数右移,最终都会等于-1(所有bit都是1)。
有符号算数右移与除法
有符号算数右移与对应的除法并不等价,比如,-1 / 2结果为0,但是 -1 >> 1结果仍位-1。其中的差别从汇编码可以看出来,下面先贴出源码:
int main() { int a = -1; int b = a / 2; int c = a >> 1; }
对应的汇编码:
; 1 : int main() { push ebp mov ebp, esp sub esp, 12 ; 0000000cH ; 2 : int a = -1; mov DWORD PTR _a$[ebp], -1 ; 3 : int b = a / 2; mov eax, DWORD PTR _a$[ebp] cdq ;将eax的最高bit位复制到edx寄存器 sub eax, edx sar eax, 1 ;算数右移指令 mov DWORD PTR _b$[ebp], eax ; 4 : int c = a >> 1; mov eax, DWORD PTR _a$[ebp] sar eax, 1 mov DWORD PTR _c$[ebp], eax ; 5 : }
从汇编码可以看到,-1 / 2和-1 >> 1的汇编码是不一样的。
分类:
汇编
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了