lowbit运算
lowbit运算的目的是为了更快的统计数字的二进制表示中1的个数,用到了补码相关的知识,其本质是每次寻找到末尾为1的位
方式一
x&(x^(x-1))
其主要过程如下:
//下述数字都为二进制表示
//最后一位为1的情况
x = 1011
x-1 = 1010
x^(x-1) = 0001
x&(x^(x-1)) = 0001
//最后一位为0的情况
x = 1010
x-1 = 1001
x^(x-1) = 0011
x&(x^(x-1)) = 0010
方式二
x&-x
-x为x的反码加1构成补码
其主要过程如下:
//下述数字都为二进制表示
//最后一位为1的情况
x = 1011
-x = 0101
x&-x = 0001
//最后一位为0的情况
x = 1010
-x = 0110
x&-x = 0010
应用
上述方式一和方式二都可以找到当前数字的二进制表示中最末尾为1的位置,那么可以利用这个数统计当前数字二进制表示中1的个数。
- 基于lowbit运算得到当前最末尾1的位置,count++
- 用原始数减去1中计算得到的数,相当于把那一位1抹去
- 重复1,2两步直至原始数减小为0
public int lowbit(int x)
return (抹去末尾1的新x)
public int countOne(int x)
int count = 0;
while(x > 0){
x = lowbit(x);
count++;
}
return count;