交换两个数

  • 技巧: 使用异或运算 ^ 交换两个数。
  • 解释: 无需临时变量即可交换。
  • 代码:
    a ^= b
    b ^= a
    a ^= b

取反加一求负数

  • 技巧: 使用 ~n + 1 求负数。
  • 解释: 等价于 -n
  • 代码:
    neg_n = ~n + 1

判断是否为 2 的幂

  • 技巧: 使用 n & (n - 1) 判断。
  • 解释: 如果结果为 0n 是 2 的幂。
  • 代码:
    if n & (n - 1) == 0:
        print("是2的幂")

计算二进制中 1 的个数

  • 技巧: 使用 n &= (n - 1) 循环计算。
  • 解释: 每次操作消除一个1,直到 n 为 0。
  • 代码:
    count = 0
    while n:
        n &= (n - 1)
        count += 1
    print(count)

获取最低位的 1

  • 技巧: 使用 n & -n 获取最低位的 1。
  • 解释: 结果为最低位 1 所在的值。
  • 代码:
    lowest_one = n & -n

将最低位的 1 置 0

  • 技巧: 使用 n & (n - 1) 将最低位的 1 置 0。
  • 解释: 常用于计算 1 的个数或判断 2 的幂。
  • 代码:
    n = n & (n - 1)

位移运算

  • 技巧: 使用 <<>> 进行位移。
  • 解释: n << k 等价于 n * 2^kn >> k 等价于 n // 2^k
  • 代码:
    n = n << 1  # 乘以2
    n = n >> 1  # 除以2

掩码操作

  • 技巧: 使用掩码提取或设置特定位。
  • 解释: 常用于位掩码操作。
  • 代码:
    mask = 1 << k  # 第k位
    bit = (n & mask) >> k  # 提取第k位
    n |= mask  # 设置第k位为1
    n &= ~mask  # 设置第k位为0

快速幂运算

  • 技巧: 使用位移和与运算加速幂运算。
  • 解释: 常用于大数幂运算。
  • 代码:
    def fast_pow(base, exponent):
        result = 1
        while exponent > 0:
            if exponent & 1:
                result *= base
            base *= base
            exponent >>= 1
        return result

判断某一位是否为 1

  • 技巧: 使用 n & (1 << k) 判断第 k 位是否为 1。
  • 解释: 结果为 0 则第 k 位为 0,否则为 1。
  • 代码:
    if n & (1 << k):
        print("第k位是1")

将某一位设置为 1

  • 技巧: 使用 n |= (1 << k) 将第 k 位设置为 1。
  • 解释: 无论原值如何,第 k 位都会被置 1。
  • 代码:
    n |= (1 << k)

将某一位设置为 0

  • 技巧: 使用 n &= ~(1 << k) 将第 k 位设置为 0。
  • 解释: 无论原值如何,第 k 位都会被置 0。
  • 代码:
    n &= ~(1 << k)

异或运算的性质

  • 技巧: 异或运算满足交换律和结合律,且 a ^ a = 0a ^ 0 = a
  • 解释: 常用于找唯一出现一次的数字。
  • 代码:
    result = 0
    for num in nums:
        result ^= num
    print(result)