目录
解析:
解法一:
拿到这个题目我们如何思考呢?
像这种的数的题,我们初学者应该想的是除法和取模,那我们如何思考呢
首先因为是二进制,所以我们也不能像以前除10模10了,我们这里肯定进行除2模2了
既然是二进制题目,先拿15举例
10的二进制:
0000 0000 0000 0000 0000 0000 0000 101010%2=0;10/2=5;5%2=1;5/2=2;2%2=1;直到为0则停止,之后计数就可以
的数目了。
代码实现:
#include<stdio.h> void count_num_bit(int m) { //先模二在除二 int count = 0;//计数 while (m) { if (m % 2 == 1) { count++; } m = m / 2; } printf("%d\n", count); } int main() { int m = 0; scanf("%d", &m); count_num_bit(m); return 0; }
但是有个缺陷:
缺陷就是不能计算负数。
解法二:
第二种方法我们怎么思考呢?
还是从二进制的角度思考
15的二进制:
0000 0000 0000 0000 0000 0000 0000 1111我们给15的二进制&1
00000000000000000000000000001111
00000000000000000000000000000001
&之后得到
00000000000000000000000000000001
我们再将15的二进制位向右移动一位
0000000000000000000000000000111 1
在进行与1&
得到
0000000000000000000000000000001
这样我们可以发现只要给某二进制的&1,该二进制的第一位是什么数字就是什么数字
这样我们就得到思路了
我们只要给二进制&1,然后在给二进制向右移位,这样循环32次就可以了
代码实现:
#include<stdio.h> void count_num_bit(int m) { int i = 0; int count = 0; for (i = 0; i < 32; i++) { if ((m >> i) & 1)//升级版 { count++; } /*if ((m & 1) == 1) { count++; } m = m >> 1;*/ } printf("%d\n", count); } int main() { int m = 0; scanf("%d", &m); count_num_bit(m); return 0; }
解法三:
这个方法是个经典,一定要理解的深一点
我们也是从二进制的角度思考
00000000000000000000000000001111 m
00000000000000000000000000001110 m-1
m&m-1 : 00000000000000000000000000001110
00000000000000000000000000001110 m=m&m-1
00000000000000000000000000001101 m-1
m&m-1 :00000000000000000000000000001100
以此类推.............
我们就可以发现每次m&m-1就会少一个一那我们只要计算少了几次一就可以了
代码实现:
#include<stdio.h> void count_num_bit(int m) { int i = 0; int count = 0; for (i = 0; i < 32; i++) { if ((m & (m - 1))>>i) { count++; } } printf("%d\n", count); } int main() { int m = 0; scanf("%d", &m); count_num_bit(m); return 0; }
变式题
获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
#include<stdio.h>
void count_different_num_bit(int a)
{
int i = 0;
for (i = 30; i >= 0; i -= 2)
{
printf("%d ",(a>>i)&1);
}
printf("\n");
for (i = 31; i >= 0; i -= 2)
{
printf("%d ", (a >> i) & 1);
}
}
int main()
{
int a = 0;
scanf("%d", &a);
count_different_num_bit(a);
return 0;
}
变式题2
编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
输入例子 :
1999 2299
输出例子 : 7
#include<stdio.h>
void count_different_num_bit(int a, int b)
{
int num = a ^ b;
int i = 0;
int count = 0;
for (i = 0; i < 32; i++)
{
if ((num >> i) & 1)
{
count++;
}
}
printf("%d\n", count);
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d",&a,&b);
count_different_num_bit(a,b);
return 0;
}