简单解释一下,就是写一个函数,传个实参过去,整数,然后该函数返回这个整数的二进制的个数;今天发现了三种方法可以求解,所以写个博客记录一下,以后想起来了可以回过来看看;
1、第一种:我们一般传过去的都是十进制的整数,所以可以利用求二进制的方法来求1的个数;对2取余,余1的话就说明二进制中有个1,然后除以二,在取余,直到除2之后为0,代码如下:
int count_one_bits(int integer)
{
int count = 0;//用来记录二进制中1的个数
while (integer > 0)
{
if (integer%2==1)
{
count++;
integer /= 2;
}
else
{
integer /= 2;
}
}
return count;
}
2、第二种:利用位操作符来解决;这里有个小技巧,如果你想要获得整数n的二进制i位的值(1或0),可以右移(i-1)位,然后或1(&1),就可以求出i位的值了,就是这样n>>(i-1)&1,就可以求出第i位的值,如果是1的话加1,不然就不加,代码如下:
int count_one_bits(unsigned int integer)
{
int i = 0;
int count = 0;
for ( i = 0; i < 32; i++)
{
if (((integer >> i) & 1) == 1)
{
count++;
}
}
return count;
}
自己用画图板做的简单注释:
3、第三种:这种方法也是用位操作符解决的;只用一个与运算符&就能解决;n&(n-1),每与一次,n的二进制位中1的个数就少一个,直到二进制位全为0,循环结束
int count_one_bits(unsigned int integer)
{
int count = 0;
while (integer)
{
integer = integer&(integer - 1);//每与一次,他的二进制位少个1,将它的二进制位最低低位的1变成0;
count++;//计数器;
}
return count;
}
下图是我做的注释