找回密码
 立即注册
查看: 379|回复: 0

[其它] 深入理解Python中的位运算与常用内置函数与模块

[复制链接]

279

主题

0

回帖

964

积分

超级版主

积分
964
发表于 2024-7-8 11:41:10 | 显示全部楼层 |阅读模式
本帖最后由 Shaw0xyz 于 2024-7-8 12:15 编辑

1. 引言

Python 是一门功能强大且灵活的编程语言,除了其广泛使用的高级功能外,位运算在某些情况下也非常有用。位运算能高效地处理二进制数据,尤其适用于底层编程和性能优化。本文将详细介绍 Python 中的位运算以及一些常用的内置函数与模块,帮助读者更好地理解和应用这些工具。

2. 位运算概述

位运算是一种直接对二进制位进行操作的运算。Python 中支持以下几种常见的位运算:
(1) 按位与(&)
(2) 按位或(|)
(3) 按位异或(^)
(4) 按位取反(~)
(5) 左移(<<)
(6) 右移(>>)

3. 常用位运算示例

3.1 按位与(&)

按位与运算符对两个整数的每一位执行逻辑与操作。只有两个对应的二进制位都为 1 时,结果位才为 1。

  1. a = 60  # 60 = 0011 1100
  2. b = 13  # 13 = 0000 1101
  3. c = a & b  # 12 = 0000 1100
复制代码


3.2 按位或(|)

按位或运算符对两个整数的每一位执行逻辑或操作。只要两个对应的二进制位中有一个为 1,结果位就为 1。

  1. a = 60  # 60 = 0011 1100
  2. b = 13  # 13 = 0000 1101
  3. c = a | b  # 61 = 0011 1101
复制代码


3.3 按位异或(^)

按位异或运算符对两个整数的每一位执行逻辑异或操作。只有两个对应的二进制位不相同时,结果位才为 1。

  1. a = 60  # 60 = 0011 1100
  2. b = 13  # 13 = 0000 1101
  3. c = a ^ b  # 49 = 0011 0001
复制代码


3.4 按位取反(~)

按位取反运算符对整数的每一位执行逻辑非操作。它将 0 变为 1,1 变为 0。

  1. a = 60  # 60 = 0011 1100
  2. c = ~a  # -61 = 1100 0011
复制代码


3.5 左移(<<)

左移运算符将一个整数的所有位左移指定的位数,右侧用 0 填充。

  1. a = 60  # 60 = 0011 1100
  2. c = a << 2  # 240 = 1111 0000
复制代码


3.6 右移(>>)

右移运算符将一个整数的所有位右移指定的位数,左侧用符号位填充。

  1. a = 60  # 60 = 0011 1100
  2. c = a >> 2  # 15 = 0000 1111
复制代码

4. 常用内置函数与模块

4.1 bin()

bin() 函数用于将整数转换为二进制字符串。

  1. bin(60)  # '0b111100'
复制代码


4.2 int()

int() 函数可以将二进制字符串转换为整数。

  1. int('0b111100', 2)  # 60
复制代码


4.3 struct 模块

struct 模块用于在 Python 中处理 C 语言结构体中的数据。

  1. import struct

  2. # 将整数转换为字节
  3. packed_data = struct.pack('i', 60)
  4. print(packed_data)  # b'<\x00\x00\x00'

  5. # 将字节转换为整数
  6. unpacked_data = struct.unpack('i', packed_data)
  7. print(unpacked_data)  # (60,)
复制代码


4.4 bitarray 模块

bitarray 模块用于创建和操作位数组。它不是 Python 内置模块,需要使用 pip 安装。

  1. from bitarray import bitarray

  2. # 创建位数组
  3. a = bitarray('1100')
  4. b = bitarray('1010')

  5. # 按位与
  6. c = a & b
  7. print(c)  # bitarray('1000')
复制代码

5. 应用示例

5.1 网络编程中的位运算

在网络编程中,经常使用位运算来处理 IP 地址和子网掩码。

  1. def ip_to_int(ip):
  2.     parts = ip.split('.')
  3.     return (int(parts[0]) << 24) + (int(parts[1]) << 16) + (int(parts[2]) << 8) + int(parts[3])

  4. def int_to_ip(num):
  5.     return f"{(num >> 24) & 0xFF}.{(num >> 16) & 0xFF}.{(num >> 8) & 0xFF}.{num & 0xFF}"

  6. ip = "192.168.1.1"
  7. ip_int = ip_to_int(ip)
  8. print(ip_int)  # 3232235777

  9. ip_str = int_to_ip(ip_int)
  10. print(ip_str)  # 192.168.1.1
复制代码


5.2 数据压缩中的位运算

位运算在数据压缩和加密中也非常常用。例如,可以使用位运算实现简单的位级别的加密解密操作。

  1. def encrypt_decrypt(data, key):
  2.     return bytes([b ^ key for b in data])

  3. data = b"Hello, World!"
  4. key = 0x55
  5. encrypted = encrypt_decrypt(data, key)
  6. print(encrypted)

  7. decrypted = encrypt_decrypt(encrypted, key)
  8. print(decrypted)  # b'Hello, World!'
复制代码


6. 结论

本文介绍了 Python 中的位运算及其常用的内置函数与模块,通过详细的示例帮助读者理解这些操作的应用场景和方法。希望本文能帮助你更好地掌握 Python 中的位运算,并在实际开发中应用这些技巧。








/ 荔枝学姐de课后专栏 /

Hi!这里是荔枝学姐~

欢迎来到我的课后专栏

自然语言学渣 NLP摆烂姐

热衷于技术写作 IT边角料

AIGC & Coding & linux ...

~互撩~ TG: @Shaw_0xyz
荔枝学姐爱吃荔枝!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系站长|Archiver|手机版|小黑屋|主机论坛

GMT+8, 2025-4-4 13:42 , Processed in 0.067190 second(s), 24 queries .

Powered by 主机论坛 HostSsss.Com

HostSsss.Com

快速回复 返回顶部 返回列表