/*
解法一
将二进制数的各位相加,结果即为1的个数。从两位二进制开始计算,以32位机为例。
55555555h = 01010101010101010101010101010101b
33333333h = 00110011001100110011001100110011b
0f0f0f0fh = 00001111000011110000111100001111b
00ff00ffh = 00000000111111110000000011111111b
0000ffffh = 00000000000000001111111111111111b
1) 奇偶位相加 2) 2位一组相加 3) 4位为一组相加 4) 8位为一组相加 ..
00->00 0001->0001
01->01 0101->0010
10->01 0110->0011
11->10 1010->0100
*/
unsigned long func(unsigned long x)
{
x = (x & 0x55555555UL) + ((x >> 1) & 0x55555555UL);
x = (x & 0x33333333UL) + ((x >> 2) & 0x33333333UL);
x = (x & 0x0f0f0f0fUL) + ((x >> 4) & 0x0f0f0f0fUL);
x = (x & 0x00ff00ffUL) + ((x >> 8) & 0x00ff00ffUL);
x = (x & 0x0000ffffUL) + ((x >> 16) & 0x0000ffffUL);
return x;
}
/*
解法二
若
n = XXXXXX10000b
n-1 = XXXXXX01111b
n & n-1 = XXXXXX00000b
将最低位起遇到的第一个1置零,计数器加1
*/
int bit_count(unsigned int n)
{
int count = 0;
for(; n; n &= n - 1) count++;
return count;
}
解法一
将二进制数的各位相加,结果即为1的个数。从两位二进制开始计算,以32位机为例。
55555555h = 01010101010101010101010101010101b
33333333h = 00110011001100110011001100110011b
0f0f0f0fh = 00001111000011110000111100001111b
00ff00ffh = 00000000111111110000000011111111b
0000ffffh = 00000000000000001111111111111111b
1) 奇偶位相加 2) 2位一组相加 3) 4位为一组相加 4) 8位为一组相加 ..
00->00 0001->0001
01->01 0101->0010
10->01 0110->0011
11->10 1010->0100
*/
unsigned long func(unsigned long x)
{
x = (x & 0x55555555UL) + ((x >> 1) & 0x55555555UL);
x = (x & 0x33333333UL) + ((x >> 2) & 0x33333333UL);
x = (x & 0x0f0f0f0fUL) + ((x >> 4) & 0x0f0f0f0fUL);
x = (x & 0x00ff00ffUL) + ((x >> 8) & 0x00ff00ffUL);
x = (x & 0x0000ffffUL) + ((x >> 16) & 0x0000ffffUL);
return x;
}
/*
解法二
若
n = XXXXXX10000b
n-1 = XXXXXX01111b
n & n-1 = XXXXXX00000b
将最低位起遇到的第一个1置零,计数器加1
*/
int bit_count(unsigned int n)
{
int count = 0;
for(; n; n &= n - 1) count++;
return count;
}