lowbit小解
lowbit小解
提问:求一个正整数的二进制最小非零位
遍历肯定能解,但不是最方便的方法,因此计算机算法学者发明了lowbit函数以达成目标
lowbit是一个在计算机科学和算法中常用的函数,尤其在树状数组(Fenwick Tree)等数据结构中扮演重要角色。它的作用是快速求出一个整数的二进制表示中最低位的 1 及其后面的 0 所构成的数值。
1. lowbit 的定义
对于一个整数 x,lowbit(x)返回 x的二进制表示中最低位的 1 及其后面的 0 所组成的数值。
数学表达式:
lowbit(x)=x&(−x)
其中 &是按位与运算符,-x是 x的二进制补码表示。
2. 原理分析
(1) 补码表示
在计算机中,负数是用补码表示的。对于一个整数 x,其补码 -x可以表示为:
−x=∼x+1
其中 ~x是 x的按位取反。
(2) 按位与运算
计算 x & (-x)时:
~x会将 x的所有二进制位取反。
~x + 1会导致最低位的 1 变成 0,并产生一个进位,使得更高位的 0 变成 1。
最终 x & (-x)会保留 x的最低位的 1,而其他位全部置 0。
示例:
设 x = 12,其二进制表示为 1100。
-x的补码计算:
~x = 0011(按位取反)
~x + 1 = 0100(补码)
x & (-x) = 1100 & 0100 = 0100(即 4)。
所以 lowbit(12) = 4。
代码也非常简单
int lowbit(int x) {return x & (-x);
}