之前我们已经知道如何输入一个二进制数中1的个数,这样找两个数二进制位不同的问题同样可以转化位寻找二进制位中的1.
既然谈到了二进制,又和两个数二进制对比有关,我们很自然的就想到了^(按位异或),将m^n之后,两个数二进制位不同的位全部变为了1,相同的则为0,这样我们找一个临时变量将m^n的结果存下来,再对这个临时变量找二进制的1,就完成题目中的需求.
代码如下:
#include <stdio.h>
#include <stdlib.h>
int main(){
int num1 = 1999;
int num2 = 2299;
int ret = num1 ^ num2;
int count = 0;
int i;
for (i = 0; i < 32; ++i){
if (ret & (1 << i)){
++count;
}
}
printf("%d\n",count);
system("pause");
return 0;
}
当然,为了验证我们的结果,我们还可以把两个数的二进制数打出来看一下.
打印一个二进制数,我们可以利用这样一个for循环
for (i = 31; i >= 0; --i){
printf("%d", (num1 >> i) & 1);
}
printf("\n");
for (i = 31; i >= 0; --i){
printf("%d", (num2 >> i) & 1);
}
printf("\n");
让i从31开始目的是为了从高位开始打印,依次判断是1还是0.然后将这段打印二进制数的代码加到上面的代码中.
#include <stdio.h>
#include <stdlib.h>
int main(){
int num1 = 1999;
int num2 = 2299;
int ret = num1 ^ num2;
int count = 0;
int i;
for (i = 0; i < 32; ++i){
if (ret & (1 << i)){
++count;
}
}
for (i = 31; i >= 0; --i){
printf("%d", (num1 >> i) & 1);
}
printf("\n");
for (i = 31; i >= 0; --i){
printf("%d", (num2 >> i) & 1);
}
printf("\n");
printf("%d\n",count);
system("pause");
return 0;
}
结果如图所示: