文章目录
- 作业标题
- 作业内容
- 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的个数。


















