Luke a Pro

Luke Sun

Developer & Marketer

🇺🇦
EN||

位运算 (Bit Manipulation)

| , 2 minutes reading.

位运算:总机接线员

算法背后的故事:开关大师

想象一面巨大的墙,上面装满了数百万个灯光开关。

  • 普通程序员看着这面墙说:“我想打开‘访客权限’那盏灯。”他们调用一个函数,该函数又调用另一个函数,最终拨动了一个开关。
  • 位运算大师 看着这面墙,他发现整面墙其实就是一个数字。为了同时打开 100 盏灯,他不需要走到每个开关前;他只需要应用一个“掩码 (Mask)”(一种模式),然后在一纳秒内同时拨动它们。

这就是 位运算 (Bit Manipulation)。这是一门绕过数字和字符串的抽象,直接与 位 (Bit)(0 和 1)打交道的艺术。在 CPU 内部,其实并没有“乘法”——只有位移和加法。通过使用这种语言,你达到了硬件性能的理论极限。

为什么需要它?

  • 标志位与权限: 与其使用 8 个布尔变量(占用 8 个字节),你可以将 8 个权限存储在单个字节中,每个位代表一个标志(例如:读、写、执行)。
  • 压缩: 紧凑地打包数据以节省带宽(例如:用 16 位而不是 32 位存储像素颜色)。
  • 性能: x >> 1 通常比 x // 2 快。x & 1x % 2 快。
  • 密码学: 将数据与密钥进行异或 (XOR) 运算是几乎所有流加密算法的基础。

算法是如何“思考”的

位运算有 4 件核心工具:

  1. 与 (&): “两个开关都打开了吗?”(用于检查标志位)。
  2. 或 (|): “打开其中任何一个开关。”(用于设置标志位)。
  3. 异或 (^): “两个开关的状态不同吗?”(用于切换状态和基础加密)。
  4. 位移 (<<, >>): “将所有开关向左/向右滑动。”(用于快速乘以/除以 2 的冪)。

工程决策:XOR 的魔力

异或 (XOR) 是计算机科学中的“魔术”。它有一个独特的属性:A ^ B ^ B = A。 如果你将一个数字与一个密钥进行两次异或运算,你会得到原始数字。这就是为什么它是加密系统和磁盘阵列 (RAID) 恢复系统的核心。

实现参考 (Python)

def bit_tricks():
    x = 10 # 二进制: 1010
    
    # 1. 检查奇偶性 (最低位技巧)
    # 10 & 1 -> 1010 & 0001 -> 0000 (偶数)
    is_even = (x & 1) == 0
    
    # 2. 检查是否为 2 的冪
    # 二进制中 2 的冪只有一个 '1' (例如 8 是 1000)
    # 8 & 7 -> 1000 & 0111 -> 0000
    def is_power_of_two(n):
        return n > 0 and (n & (n - 1)) == 0

    # 3. 不使用临时变量交换两个数 (XOR 技巧)
    a, b = 5, 9
    a = a ^ b
    b = a ^ b
    a = a ^ b
    # 现在 a=9, b=5

    # 4. 计算“1”的个数 (汉明重量)
    def count_ones(n):
        count = 0
        while n:
            n &= (n - 1) # 这行神妙的代码会清除最低位的那个 '1'
            count += 1
        return count

    return is_even, is_power_of_two(16), a, b, count_ones(7)

# 示例结果
print(bit_tricks()) # (True, True, 9, 5, 3)

小结

位运算教会我们:效率存在于最底层。通过剥离高级类型的舒适感,我们获得了对机器的完全控制。它提醒我们,无论软件变得多么复杂,其核心始终是数百万個微小開關的美麗舞蹈。