方法1、
在电脑内存中存放的数据是二进制存放的,我们可以观察二级制的特点
通过观察一些数的二进制我们可已看出一个偶数的最后一个二进制位是0,奇数的最后一个二进制位是1;利用这个特性我们得到二进制中1的个数。其中unsigned int 可以很好的解决求负数的问题。
int is_number_of_1(unsigned int x)
{
int count = 0;
while (x)
{
//第一种方法
//6
//00000000 00000000 00000000 00000110
//3
//00000000 00000000 00000000 00000011
if (x % 2 == 1)
{
count++;
}
x >>= 1;
}
return count;
}
int main()
{
int a = 0;
scanf("%d", &a);
int ret = is_number_of_1(a);
printf("%d", ret);
return 0;
}
方法2、
利用按位操作符
int is_number_of_1(unsigned int x)
{
int i = 1;
int count = 0;
while (i<=32)
{
//000000000 000000000 000000000 000000001
//利用按位&
//相同为1
//相异为0
if ((x & 1) == 1)
{
count++;
}
x >>= 1;
i++;
}
return count;
}
int main()
{
int a = 0;
scanf("%d", &a);
int ret = is_number_of_1(a);
printf("%d", ret);
return 0;
}
方法3、
利用表达式x=x&(x-1)
起原理如图
不断产生新的x,知道x=0位置,这个表达式会把x最右边的1去掉。
也就是进行几次x=x&(x-1)即二进制中1的个数就有几个。
int is_number_of_1(unsigned int x)
{
int count = 0;
while (x)
{
x = x & (x - 1);
count++;
}
return count;
}
int main()
{
int a = 0;
scanf("%d", &a);
int ret = is_number_of_1(a);
printf("%d", ret);
return 0;
}