位运算的妙用之二进制1的个数
题目:求出一个正整数转换成二进制形式中数字"1"的个数
如:int 型数值为 80
转化成二进制形式:80 = 00000000 00000000 00000000 01010000
因此 1 的个数为 2
普通法
一位一位判断
int bitCount1(int n) {
int count = 0;
while (n != 0) {
if (n & 0x01 == 1)
count++;
n = n >> 1;
}
return count;
}
快速法
这种方法速度比较快,其运算次数与输入n的大小无关,只与n中1的个数有关。如果n的二进制表示中有k个1,那么这个方法只需要循环k次即可。其原理是不断清除n的二进制表示中最右边的1,同时累加计数器,直至n为0。
int bitCount2(int n) {
int count = 0;
while (n != 0) {
n = n & (num - 1);
count++;
}
return count;
}
极速法
int bitCount3(int n) {
n = n - ((n >> 1) & 0x55555555);//n = (n & 0x55555555) + ((n >> 1) & 0x55555555);
n = (n & 0x33333333) + ((n >> 2) & 0x33333333);
n = (n & 0x0f0f0f0f) + ((n >> 4) & 0x0f0f0f0f);
n = n + (n >> 8); //n = (n & 0x00ff00ff) + ((n >> 8) & 0x00ff00ff);
n = n + (n >> 16); //n = (n & 0x0000ffff) + ((n >> 16) & 0x0000ffff);
return n & 0x0000003f; //return n;
}