题目介绍
输入一个整数,统计该整数中0的个数。
其实这道题与我们之前讲过的统计二进制中1的个数很类似。所以这篇博客我主要介绍较快的那一个方法。
解法
请看以下表达式 n=n|(n+1);
该表达式的作用就是将n的二进制位中最右侧的0变为1。
图解:
我们可以发现,当该整数的二进制位中全部都变成1时,n+1的值就会溢出,变成0。
图解:
所以我们的大概思路就是使用循环,每循环一次,将n的二进制位中最右边的0变成1,当n为全1,n+1则为0,此时跳出循环。
代码如下
#include <stdio.h>
int main()
{
int n = 0;
int count = 0;
scanf("%d", &n);
while (n + 1)
{
count++;
n = n | (n + 1);
}
printf("%d\n", count);
return 0;
}
代码运行结果:
总结
重点知识就是表达式n=n|(n+1);
需要了解其原理,和学会使用它,本题只是其中一个使用案例,以后遇到其他有趣的题目我也会分享出来。