一、问题与分析
1、问题
求解32位int整数的二进制表示中0的个数。
输入一个整数,输出其二进制表示中0的个数,负数用其补码表示。
2、分析
对于输入的数,我们可以直接认为其是用二进制表示的,不需要我们对数字做额外处理。只需要直接对数字进行0个数的判定。
二、两种解法
1、二进制序列中0的个数 = 32 - 二进制序列1的个数
不再解释,详见《【001 位操作】如何求解整型数的二进制表示中1的个数?》文章。
2、得到每一位进行分别判断
#include <stdio.h>
#define size_t int
size_t Binary_zero(int n)
{
int i = 0;
size_t count = 0;
for (i = 0; i < 32; i++)
{
if ( ((n >> i) & 1) == 0)
{
count++;
}
}
return count;
}
int main()
{
int n = 0;
scanf("%d", &n);
size_t ret = Binary_zero(n);
printf("%d\n", ret);
}
3、x|(x+1)
就把内存中的最低位的0变成1,最后为全1序列 ->补码为全1 ->对应十进制值为-1。应该是针对补码来讲的,下面的图用的二进制原码,不太合适。
#include <stdio.h>
int CountZeroBit(int num)
{
int count = 0;
while (num + 1)// num变为-1的时候跳出
{
count++;
num |= (num + 1); //算法转换
}
return count;
}
int main()
{
int value = 15;
int ret = CountZeroBit(value);
printf("%d的二进制位中0的个数为%d\n",value, ret);
return 0;
}