文章目录
- 作业标题
- 作业内容
- 2.解题思路
- 3.具体代码
- 4.代码讲解
作业标题
求两个数二进制中不同位的个数
作业内容
编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
输入例子:
1999 2299
输出例子:7
2.解题思路
- 先将m和n进行按位异或,此时m和n相同的二进制比特位清零,不同的二进制比特位为1
- 统计异或完成后结果的二进制比特位中有多少个1即可
3.具体代码
#include <stdio.h>
int main() {
int a, b;
int count = 0;
while (scanf("%d %d", &a, &b) != EOF) {
int tmp = a ^ b;
while (tmp)
{
tmp = tmp & (tmp - 1);
count++;
}
printf("%d\n", count);
}
return 0;
}
打印:
4.代码讲解
-
定义a,b
-
定义count=0
-
进入while循环,循环条件是输入不为空就继续
-
定义
tmp=a ^ b
,计算变量a
和b
的异或结果,并将结果存储在变量tmp
中。异或是相同为0,不同为1。
例如1999和2299
1999的二进制表示: 0111 1100 1111 2299的二进制表示: 1000 1111 1011
进行异或操作:
0111 1100 1111 ^ 1000 1111 1011 ----------------- 1111 0011 0100
所以,
tmp
的值将是1111 0011 0100
。 -
进入while循环
-
tmp = tmp & (tmp - 1);
:在每次循环中,tmp
与tmp - 1
进行按位与操作。这个操作会将tmp
中最右边的1变成0,因为tmp - 1
会将tmp
中最右边的1变成0,并将最右边的所有0变成1。 -
count++;
:每次循环,count
增加1,因为tmp
中有一个1被清除了。 -
打印出
count
的值,即tmp
中1的个数。