说明(java实现)
例如5对应的二进制为101,故有两个1。
方法一
// 右移32次,每次和1进行与操作,判断最右位是不是为1。
public int bitCount(int n){
int count=0,times=32;
while(times>0){
count=count+(n&1);
n>>>1;
times--;
}
return count;
}
方法二
// 若n不为0,则n中必有一位是1,n-1必有 一位从1变成0
public static int bitCount(int n){
int count=0;
while(n!=0){
count++;
n=n&(n-1);
}
return count;
}
方法三 Integer.bitCount()实现方法
基本的四种情况理解一下,2个bit
原数 | 减 | 绝对右移一位 | 结果 | 对应十进制 |
---|---|---|---|---|
11 | - | 01 | = 10 | => 2 |
10 | - | 01 | = 01 | => 1 |
01 | - | 00 | = 01 | => 1 |
00 | - | 00 | = 00 | => 0 |
- 先将数两位分隔,获得两位中1的个数
- 然后将结果合并,四位内,将高两位的结果合并到低两位中
- 八位内,将高四位的结果合并到底四位中
- 十六位内,将高八位的结果合并到底八位中
- 三十二为内中,将高十六位的结果合并到低十六位中
- 获取结果,因为最大的个数是32,7位就能保存最大情况了,7位之前(准确来说6位就能保存32bit的整数对应的1的个数)。
public static int bitCount(int i) {
// HD, Figure 5-2
i = i - ((i >>> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
i = (i + (i >>> 4)) & 0x0f0f0f0f;
i = i + (i >>> 8);
i = i + (i >>> 16);
return i & 0x3f;
}