2.2 计算机底层运算:二进制移位运算、补码与左右移

发布时间:2026/5/27 12:18:12

2.2 计算机底层运算:二进制移位运算、补码与左右移 本章导读上一篇我们搞懂了二进制是什么这篇我们来玩 “二进制魔法”移位 乘除、补码 负数的二进制表达还有让无数人困惑的「逻辑右移 vs 算术右移」用代码和比喻一次性讲透。一、移位运算和乘除运算的关系1. 生活化比喻移位就像 “小数点搬家”十进制里把5的小数点右移一位变成50就是 ×10左移一位变成0.5就是 ÷10。二进制里左移一位 ×2右移一位 ÷2原理完全一样2. 零门槛实操移位运算代码示例以 Python 为例# 左移运算相当于 ×2^n a 5 # 二进制 101 print(a 1) # 101010 5×2 print(a 2) # 2010100 5×4 # 右移运算相当于 ÷2^n向下取整 b 13 # 二进制 1101 print(b 1) # 6110 13//2 print(b 2) # 311 13//43. 场景案例移位运算比乘除更快在底层运算中移位运算只需要移动电路中的电平速度比乘法 / 除法快 10 倍以上所以高性能代码比如游戏引擎、嵌入式开发会大量用移位替代乘除# 普通写法 x y * 4 # 高效写法移位 x y 2 # 效果完全一样速度更快二、便于计算机处理的 “补数”1. 生活化比喻补码就像 “钟表减法”钟表上要从 3 点到 1 点有两种方法往回拨 2 小时减法3-21往前拨 10 小时加法31013钟表只显示 1补码就是用加法代替减法的技巧负数用正数的 “补数” 表示计算机只需要做加法就能完成减法。2. 零门槛实操补码的计算规则以 8 位二进制为例正数原码 反码 补码直接表示例5 →0000 0101负数补码 反码 1例-5 → 原码1000 0101→ 反码1111 1010→ 补码1111 10113. 场景案例为什么计算机用补码统一加减法减法可以转成加法硬件只需要设计加法器避免 0 的二义性原码中0000 0000和1000 0000都表示 0补码中只有0000 0000表示 0溢出处理更简单加法溢出时直接丢弃高位结果依然正确三、逻辑右移和算术右移的区别1. 核心区别补 0 还是补符号位右移类型处理方式适用场景逻辑右移左边补 0无符号数比如像素值、地址算术右移左边补符号位正数补 0负数补 1有符号数比如整数、负数2. 生活化比喻逻辑右移是 “整体搬家”算术右移是 “带着符号搬家”逻辑右移把二进制数当成一串无意义的 0/1整体往右挪左边空出来的位置补 0算术右移把二进制数当成有符号的数往右挪时要保留符号正数还是正数负数还是负数3. 零门槛实操代码对比以 Java 为例Python 只有算术右移// 正数两种右移结果一样 int a 13; // 二进制 0000 1101 System.out.println(a 1); // 60000 0110 System.out.println(a 1); // 60000 0110 // 负数结果不同 int b -13; // 二进制 1111 0011补码 System.out.println(b 1); // -71111 1001算术右移补1 System.out.println(b 1); // 21474836410111 1001...逻辑右移补0四、进阶拓展移位运算的边界问题溢出问题左移时如果超出位数高位会被丢弃导致结果错误例8 位二进制0111 1111127左移 1 位 →1111 1110-2负数右移算术右移永远向下取整比如-13 1 -7而不是-6性能优化移位运算只适用于 2 的幂次乘除其他情况还是用普通乘除更清晰五、常见问题排查❌ 误区 1“右移就是除以 2”✅ 正解只有正数右移等于除以 2负数算术右移是向下取整比如-13 1 -7不是-6.5。❌ 误区 2“逻辑右移和算术右移在 Python 里一样”✅ 正解Python 没有无符号整数类型所以只有算术右移逻辑右移需要手动处理。❌ 误区 3“补码很难不用学也没关系”✅ 正解补码是计算机处理负数的核心理解补码才能看懂底层报错、调试内存问题是进阶程序员的必备知识。 下一篇预告最后一篇我们来解锁逻辑运算的实战技巧与 / 或 / 异或在编程中有哪些妙用怎么用位运算优化代码

相关新闻