Lowbit 技巧详解:高效分离整数的二进制幂
一、 核心功能
lowbit 技巧是一种高效的位运算操作,其核心功能是快速获取一个整数在二进制表示中,位置最低的那个“1”所代表的数值。
例如,对于整数 12:
- 其二进制表示为
1100。 - 它最低位的“1”在第三位(从右数,值为
2^2)。 - 因此,
lowbit(12)的结果就是4。
这个技巧常用于需要逐个处理二进制位“1”的场景,如树状数组(Fenwick Tree)和一些特定的算法问题中。
二、 原理:n & -n
lowbit 操作的实现非常简洁,仅需一行代码:
int lowbit = n & -n;
负数的二进制补码表示
一个正整数 n 的负数 -n 在计算机中的表示过程如下:
- 按位取反:将
n的二进制表示中所有的0变为1,1变为0。这个操作用~n表示。 - 加一:将取反后的结果加
1。
所以,-n 在数学上等同于 ~n + 1。
以 n = 12 为例
让我们通过一个具体的例子,看看 12 & -12 是如何得到 4 的。
-
n = 12的二进制表示
我们以8位二进制为例:n = 00001100 -
计算
-n(即-12)- 步骤一:按位取反
~n00001100 (12) ~ --------11110011 (~12) - 步骤二:加一
~n + 111110011 + 00000001 ----------11110100 (-12 的二进制补码表示)
- 步骤一:按位取反
-
执行核心操作
n & -n
现在,我们将n和-n的二进制表示进行按位与(&)操作。只有在两个数中对应位都为1时,结果的该位才为1。00001100 (n = 12)& 11110100 (-n = -12)----------00000100 (结果) -
结果解读
- 二进制
00000100转换回十进制就是4。 - 回顾
n = 12的二进制00001100,它最低位的那个1确实代表2^2 = 4。 - 因此,
12 & -12成功地分离出了这个值。
- 二进制
三、 循环应用:分解整数为2的幂之和
利用 lowbit 技巧,我们可以轻松地将一个整数分解成多个2的幂的和。
