2025-11-09 00:32:27
移位指令就是给二进制数整体左推或右推,就像给数字装滑轮。比如1010左移一位变成10100,对吧?这样数值就翻倍了,因为二进制每一位左移相当于乘2,所以10变成100,再左移就是1000,依次类推。右移的话就像除2,1010右移一位变成101,末尾的0就掉水里了,如果没余数就正好,有余数就丢弃。比如8位二进制数左移8次就会变成00000000,因为超出了8位范围,这叫溢出。右移8次也会变0,因为所有位都移出丢失了。
为啥是这个答案呢?因为移位指令本质是位运算,计算机处理二进制只能按位操作。比如用8位二进制数10100000(相当于160)左移一位变成10100000<<1=101000000,但8位容器只能存前8位,所以变成00000000,也就是0。这就像把160乘以2得到320,但8位只能表示0-255,所以溢出归零。右移的话10100000>>1=01010000,也就是80,正好是160除以2的结果。数据来源是x86汇编手册和IEEE 754标准,里面明确说明移位指令会处理溢出和符号位扩展。其实移位指令还能处理负数,比如用补码表示的话,右移会补1,左移补0,这跟正数操作刚好相反。比如说那个负数-5用8位补码是11111011,右移一位变成11111101,也就是-3,正好是-5除以2的结果(-2.5取整为-3)。所以移位指令既能做乘除2的整数运算,还能处理符号位扩展,特别适合做位掩码和位测试。
本题链接: