第一种的方法是 %2 ,/2法
//三种方式实现查找二进制中一的个数
//第一种 %2 ,/2 型
int findone(unsigned int a)
{
int count = 0;
while (a)
{
if (a % 2 == 1);
{
count++;
}
a /= 2;
}
return count;
}
int main()
{
int a = 0;
scanf("%d", &a);
int c = findone(a);
printf("%d", c);
return 0;
}
这里举两个例子,4的二进制后几位为0100,在除二得到1时,上面1%2就等于1,count就会加加,然后1/2 = 0;循环停止
再如6的二进制为0110,6/2变3时,3%2 == 1,count就++,然后3/2 == 1,1%2 == 1,count++,最后1/2 == 0;循环停下,return count。
要注意,这里要将接收变量a的类型写成unsigned int ,如果是写个int,这里负数就不能实现查找。
第二种方法是 利用右移操作符 >> 和 位操作符&
//第二种,利用 右移操作符>>与1比较
int findone(unsigned int a)
{
int count = 0;
int i = 0;
for (i = 0; i < 32; i++)
{
if ((a >> i) & 1 == 1)
{
count++;
}
}
return count;
}
int main()
{
int a = 0;
scanf("%d", &a);
int c = findone(a);
printf("%d", c);
return 0;
}
这里利用了右移操作符 >> 和位操作符&,&的原理是对应的二进制位有0则为0,只有同时为1,才为1,所以这里就可以不断 比较,右移,比较。从而实现找到一的个数。
第三种方法 是利用公式a & (a-1) ,这个公式也可以判断某个数是不是2的次方
//第三种 利用a&(a-1)
int findone(unsigned int a)
{
int count = 0;
while (a)
{
a = a & (a - 1);
count++;
}
return count;
}
int main()
{
int a = 0;
scanf("%d", &a);
int c = findone(a);
printf("%d", c);
return 0;
}
这里每执行一次a&(a-1),就会少一个一,例子如下:
设a = 5 -> 0101,a - 1 = 4 -> 0100
a & (a-1) = 0100 ->4
a -1 = 3 -> 0011
a & (a-1) = 0;
这里可以很容易地看出,执行了两次a&(a-1),a的值就为0了,所以count= 2;也就是5的二进制中的1的个数(unsigned int的作用与第一个方法中的相同),这里就不再写例子了,可以自行算一下就会懂了。
以上的二进制都没有补完32位出来!