当前位置: 首页 > news >正文

Python二进制运算:高效操作与实用技巧

二进制运算主要通过位运算符来实现。这些运算符直接操作整数的二进制位,非常适合用于底层系统编程、数据加密、图像处理等领域。下面会讲解Python中主要的二进制运算规则和相关操作:

1. 位运算符

Python提供了6种位运算符,用于对整数的二进制位进行操作:

运算符描述示例运算规则
&按位与(AND)a & b对应位都为1时结果为1,否则为0
|按位或(OR)a | b对应位有一个为1时结果为1,否则为0
^按位异或(XOR)a ^ b对应位不同时结果为1,相同为0
~按位取反(NOT)~a所有位取反(包括符号位)
<<左移(Left Shift)a << n所有位左移n位,右边补0
>>右移(Right Shift)a >> n所有位右移n位,左边补符号位(有符号数)

2. 按位与(&

  • 规则:对应位都为1时结果为1,否则为0。
  • 用途:提取特定的二进制位、判断奇偶性(与1进行&运算)。

示例

a = 5   # 二进制: 0101
b = 3   # 二进制: 0011
print(a & b)  # 输出: 1(二进制: 0001)

3. 按位或(|

  • 规则:对应位有一个为1时结果为1,否则为0。
  • 用途:设置特定的二进制位。

示例

a = 5   # 二进制: 0101
b = 3   # 二进制: 0011
print(a | b)  # 输出: 7(二进制: 0111)

4. 按位异或(^

  • 规则:对应位不同时结果为1,相同为0。
  • 特性
    • a ^ a = 0
    • a ^ 0 = a
    • 满足交换律和结合律(如:a ^ b ^ a = b
  • 用途:翻转特定的二进制位、交换两个变量的值(无需临时变量)。

示例

a = 5   # 二进制: 0101
b = 3   # 二进制: 0011
print(a ^ b)  # 输出: 6(二进制: 0110)# 交换两个变量的值
a = 5
b = 3
a = a ^ b
b = a ^ b  # 此时 b = (a^b)^b = a
a = a ^ b  # 此时 a = (a^b)^a = b
print(a, b)  # 输出: 3 5

5. 按位取反(~

  • 规则:所有位取反(包括符号位)。
  • 公式~x = -(x + 1)(对有符号整数)。

示例

a = 5   # 二进制: 0101(假设为4位有符号整数)
print(~a)  # 输出: -6
# 解释: 
#  5的二进制: 0101
#  取反后:   1010(补码形式,对应十进制-6)

6. 左移(<<

  • 规则:所有位左移n位,右边补0。相当于乘以2的n次方(a << n 等价于 a * (2**n))。

示例

a = 5   # 二进制: 0101
print(a << 2)  # 输出: 20(二进制: 010100)

7. 右移(>>

  • 规则:所有位右移n位,左边补符号位(有符号数)。相当于除以2的n次方并向下取整(a >> n 等价于 a // (2**n))。

示例

a = 5   # 二进制: 01
print(a >> 1)  # 输出: 2(二进制: 0010)b = -5  # 二进制: 补码形式(假设为8位: 11111011)
print(b >> 1)  # 输出: -3(补码: 11111101)

8. 常用二进制操作技巧

8.1 判断奇偶性
num = 5
if num & 1:  # 等价于 num % 2 != 0print("奇数")
else:print("偶数")
8.2 交换两个变量的值
a = 5
b = 3
a, b = b, a  # Python内置方法
# 或使用位运算
a = a ^ b
b = a ^ b
a = a ^ b
8.3 检查第n位是否为1
num = 5  # 二进制: 0101
n = 2
if num & (1 << n):print(f"第{n}位是1")
else:print(f"第{n}位是0")
8.4 将第n位设置为1
num = 5  # 二进制: 0101
n = 1
num |= (1 << n)  # 结果: 7(二进制: 0111)
8.5 将第n位清零
num = 5  # 二进制: 0101
n = 0
num &= ~(1 << n)  # 结果: 4(二进制: 0100)
8.6 翻转第n位
num = 5  # 二进制: 0101
n = 2
num ^= (1 << n)  # 结果: 1(二进制: 0001)
8.7 计算绝对值
num = -5
mask = num >> 31  # 获取符号位(假设为32位整数)
abs_num = (num ^ mask) - mask  # 结果: 5

9. 与二进制相关的内置函数

  • bin(x):将整数转换为二进制字符串。

    print(bin(5))  # 输出: '0b101'
    
  • int(x, base):将字符串转换为指定进制的整数。

    print(int('101', 2))  # 输出: 5
    
  • format(x, 'b'):将整数转换为二进制字符串(无前缀)。

    print(format(5, 'b'))  # 输出: '101'
    print(f"{5:b}")        # f-string方式,输出: '101'
    

10. 二进制运算的性能

位运算通常比普通的算术运算(如乘法、除法)更快,因为它们直接操作底层的二进制表示,无需进行复杂的转换。在处理大量数据时,位运算可以显著提高性能。

总结

二进制运算在Python中是通过位运算符实现的,这些运算符可以直接操作整数的二进制位。掌握位运算对于优化代码、理解底层系统原理以及解决一些特定问题(如格雷码、数据加密)非常有帮助。

相关文章:

  • OpenHarmony外设驱动使用 (二),Camera
  • [ctfshow web入门] web118
  • hysAnalyser 从MPEG-TS导出ES功能说明
  • Leaflet使用SVG创建动态Legend
  • wifiactivity 界面 要在哪里注册,注销广播?onResume() vs onPause() 的本质区别
  • 安装nerdctl和buildkitd脚本命令
  • LLM智能体新纪元:深入解析MCP与A2A协议,赋能智能自动化协作
  • stack和queue简单模拟实现
  • Linux面试题集合(3)
  • 【typenum】 9 与常量泛型桥接(generic_const_mappings.rs)
  • Redis的发布订阅模型是什么,有哪些缺点?
  • GO语言语法---if语句
  • flutter flutter run 运行项目卡在Running Gradle task ‘assembleDebug‘...
  • Python文件与JSON操作全解:从基础到企业级实践
  • 05、基础入门-SpringBoot-HelloWorld
  • 政府数据开放试点企业如何抢占特许经营协议黄金席位
  • acwing5579 增加模数
  • 蓝桥杯11届国B 答疑
  • NY321NY322美光闪存芯片NY323NY336
  • 冒泡排序-java
  • 南京艺术学院博导、雕塑家尹悟铭病逝,年仅45岁
  • 被围观的“英之园”,谁建了潮汕天价违建?
  • 新城市志|GDP万亿城市,一季度如何挑大梁
  • 3月中国减持189亿美元美债、持仓规模降至第三,英国升至第二
  • 四川内江警方通报一起持刀伤人致死案:因车辆停放引起,嫌犯被抓获
  • 手机表面细菌菌落总数可能比马桶高10倍,医生详解如何洗手