找到一个数的最低二进制位(lowbit)

Lowbit 技巧详解:高效分离整数的二进制幂

一、 核心功能

lowbit 技巧是一种高效的位运算操作,其核心功能是快速获取一个整数在二进制表示中,位置最低的那个“1”所代表的数值

例如,对于整数 12

  • 其二进制表示为 1100
  • 它最低位的“1”在第三位(从右数,值为 2^2)。
  • 因此,lowbit(12) 的结果就是 4

这个技巧常用于需要逐个处理二进制位“1”的场景,如树状数组(Fenwick Tree)和一些特定的算法问题中。

二、 原理:n & -n

lowbit 操作的实现非常简洁,仅需一行代码:

int lowbit = n & -n;

负数的二进制补码表示

一个正整数 n 的负数 -n 在计算机中的表示过程如下:

  1. 按位取反:将 n 的二进制表示中所有的 0 变为 11 变为 0。这个操作用 ~n 表示。
  2. 加一:将取反后的结果加 1

所以,-n 在数学上等同于 ~n + 1

n = 12 为例

让我们通过一个具体的例子,看看 12 & -12 是如何得到 4 的。

  1. n = 12 的二进制表示
    我们以8位二进制为例:

    n = 00001100
    
  2. 计算 -n (即 -12)

    • 步骤一:按位取反 ~n
        00001100  (12)
      ~ --------
        11110011  (~12)
      
    • 步骤二:加一 ~n + 1
        11110011
      + 00000001
      ----------
        11110100  (-12 的二进制补码表示)
      
  3. 执行核心操作 n & -n
    现在,我们将 n-n 的二进制表示进行按位与(&)操作。只有在两个数中对应位都为1时,结果的该位才为1

        00001100  (n = 12)
      & 11110100  (-n = -12)
      ----------
        00000100  (结果)
    
  4. 结果解读

    • 二进制 00000100 转换回十进制就是 4
    • 回顾 n = 12 的二进制 00001100,它最低位的那个 1 确实代表 2^2 = 4
    • 因此,12 & -12 成功地分离出了这个值。

三、 循环应用:分解整数为2的幂之和

利用 lowbit 技巧,我们可以轻松地将一个整数分解成多个2的幂的和。

posted @ 2025-08-11 16:59  哒令,哒哒哒哒哒~令  阅读(149)  评论(0)    收藏  举报