求二进制数中1的个数:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//法一
int count_one_bits(int n)
{
int count = 0;
while(n)
{
n=n&(n-1);
count++;
}
return count;
}
int main()
{
int num = -1;
int ret = count_one_bits(num);
printf("%d\n",ret);
return 0;
}
//法二
int count_one_bits(unsigned int value)
{
int count = 0;
while(value)
{
if(value%2 == 1)
{
count++;
}
value /= 2;
}
return count;
}
int main()
{
unsigned int num = 0;
int ret = 0;
scanf("%d",&num);
ret = count_one_bits(num);
printf("%d\n",ret);
return 0;
}
//法三
int count_one_bits(unsigned int value)
{
int count = 0;
while(value)
{
if(value&1 == 1)
{
count++;
}
value >>= 1;
}
return count;
}
int main()
{
unsigned int num = 0;
int ret = 0;
scanf("%d",&num);
ret = count_one_bits(num);
printf("%d\n",ret);
return 0;
}
法二法三的函数参数类型为unsigned int 可以解决num为负数的情况,若是将参数类型改为int 法二法三将无法解决num为负数的情况。
法一通过n=n&(n-1);来求取二进制中1的个数,如上图所示,每进行一次按位与运算,num最右边的1就会丢掉,通过判断num为不为0,便可知道num中1的个数。
这种方法还可以用来判断一个数是不是2的k次方,如果一个数是2的k次方,那么这个二进制数中就只有一个1,则数num和num-1进行按位与运算就会得到0,通过判断num&(num-1)是否为0,就可以判断这个数是不是2的k次方。
求取两个数中有多少个不同的比特位也可以使用这种方法,代码如下。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//法一
int main()
{
int a = 0;
int b = 0;
int count = 0;
scanf("%d%d",&a,&b);
while(a||b)
{
if((a&1) != (b&1))
count++;
a >>= 1;
b >>= 1;
}
printf("%d\n",count);
return 0;
}
//法二
int count_one_bits(int n)
{
int count = 0;
while(n)
{
n=n&(n-1);
count++;
}
return count;
}
int main()
{
int n1 = 0;
int n2 = 0;
int ret = 0;
int num = 0;
scanf("%d%d",&n1,&n2);
num = n1^n2;
ret = count_one_bits(num);
printf("%d\n",ret);
return 0;
}