文章目录
- 补码取反的本质是对所有位进行翻转,最终结果满足公式:~n = -(n+1) 示例: # 5的补码:…00000101 print(~5) # 输出:-6 # -3的补码:…11111101 print(~-3) # 输出:2
- 左移 (<<) :补码整体左移,右侧补0,等价于数值乘以2(无溢出时)。负数左移时符号位保持不变,依然遵循补码规则。 右移 (>>) :正数采用逻辑右移(左侧补0),负数采用算术右移(左侧补符号位1),保证符号位不变,等价于数值除以2并向下取整。 示例: print(-5 >> 1) # 输出:-3 (算术右移,保留负号) print(5 >> 1) # 输出:2 (逻辑右移,舍去小数部分)
- 所有操作数先转换为补码后再执行对应位运算,结果再转回Python整数表示: a = 6 # 补码:0b110 b = -3 # 补码:…11111101 print(a & b) # 输出:4 (0b110 & …11111101 = 0b100) print(a | b) # 输出:-1 (…11111111) print(a ^ b) # 输出:-5 (…11111011)
目录
- 一、什么是二进制补码
- 二、Python中的补码存储机制
- 三、位运算基于补码的具体表现
- 1. 按位取反 (~)
- 2. 位移运算
- 3. 按位与/或/异或
- 四、Python补码的特殊特性
补码是计算机表示有符号整数的工业标准,解决了原码和反码的核心缺陷:
- 原码的问题:正负零存在两个不同编码(+0=0000 0000,-0=1000 0000),且加减法需要独立硬件电路支持。
- 反码的问题:依然存在正负零歧义,减法运算仍需额外逻辑转换。
补码的计算规则:
- 正数补码 = 原码:与数值本身的二进制表示完全一致
- 负数补码 = 对应正数原码取反 + 1:例如-3的补码是 0000 0011(3的原码)取反为1111 1100,再加1得到1111 1101
与C/C++等静态语言不同,Python的int类型没有固定位数限制(可动态扩展至内存上限),但内部存储严格遵循补码规则:
- 正数存储:直接以二进制原码存储,对外展示和运算时等价于补码(因为正数的补码和原码完全一致)。
- 负数存储:以补码形式存储在内存中,但对外暴露时会转换为
-绝对值的十进制形式。 - 补存储的核心优势:
- 统一加减法:无论是正数加正数、正数加负数还是负数加负数,都可以通过相同的加法电路完成运算,无需额外减法逻辑。
- 消除正负零:补码体系中+0和-0统一为全0编码,避免了歧义并节省了一个存储单元。
- 位运算兼容性:让按位与、或、异或、位移等操作在正负整数间保持逻辑一致性。
Python中所有位运算操作都会遵循以下流程:
- 将所有操作数转换为补码形式
- 执行位运算
- 将运算结果转换回Python整数表示
补码取反的本质是对所有位进行翻转,最终结果满足公式:~n = -(n+1)
示例:
# 5的补码:...00000101 print(~5) # 输出:-6 # -3的补码:...11111101 print(~-3) # 输出:2
- 左移 (<<) :补码整体左移,右侧补0,等价于数值乘以2(无溢出时)。负数左移时符号位保持不变,依然遵循补码规则。
- 右移 (>>) :正数采用逻辑右移(左侧补0),负数采用算术右移(左侧补符号位1),保证符号位不变,等价于数值除以2并向下取整。
示例:
print(-5 >> 1) # 输出:-3 (算术右移,保留负号) print(5 >> 1) # 输出:2 (逻辑右移,舍去小数部分)
所有操作数先转换为补码后再执行对应位运算,结果再转回Python整数表示:
a = 6 # 补码:0b110 b = -3 # 补码:...11111101 print(a & b) # 输出:4 (0b110 & ...11111101 = 0b100) print(a | b) # 输出:-1 (...11111111) print(a ^ b) # 输出:-5 (...11111011)
- 无限位补码:Python的整数没有固定宽度,处理负数时会自动扩展符号位,避免溢出问题。例如
-1在Python中会被视为无限个1组成的补码,因此~-1 = 0。
- 跨平台一致性:无论运行在32位还是64位系统,Python的补码存储规则保持一致,确保位运算结果跨平台稳定。
- 底层优化:尽管Python的int是动态长度,但在实际运算中会根据数值大小自动调整内存分配,平衡存储效率和运算性能。
-1在Python中会被视为无限个1组成的补码,因此~-1 = 0。理解补码存储和位运算逻辑,不仅能帮你写出更高效的位操作代码,还能解释很多看似反直觉的运算结果,比如为什么~n = -(n+1)这个公式在所有整数场景下都成立。
到此这篇关于Python整数存储与位运算深入理解的文章就介绍到这了,更多相关python整数存储与位运算内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- Python位移操作和位运算的实现示例
- Python OpenCV图像的位运算操作
- Python中位运算的详细用法教程
- 详解Python中位运算的简单实现
- 关于Python 位运算防坑指南
- 简单了解python的一些位运算技巧
- 初步认识Python中的列表与位运算符
- 解析Python中的二进制位运算符
- 详细介绍Python语言中的按位运算符