题目:查看两个int(32位)数的二进制有几位不同。
分析:要理解该题目的意思,就要明白C语言中关于位的一些操作符。
1)“&",按位与操作符,从低位到高位对两个数的每位进行与操作,如1001&1101=1001,都为1则取1;
2)"|",按位或操作符,有一个是1就取1;
3)"^",异或,不同则取1;
4)"~",非操作符,用来对一个二进制数按位取反;
5)"<<",左移操作符,右边补0;注意1<<2是将1左移2位
6)">>",右移操作符,对于无符号数,左边补0
知道了这么多先验知识,就可以美美的操作这个题,首先用一个异或,可以得到两数的不同,i的作用是每次向左移,查看该位置是否是1,k是计数,根本就不用转换成二进制,很好理解!
#include<stdio.h>
void checkDifference(int a,int b)
{
int k=0,i;
for(i=0;i<32;i++)
{
if((a^b)&(1<<i))
{
k++;
printf("第%d位不同!\n",i);
}
}
printf("共%d位不同\n",k);
}
int main()
{
int a,b;
while(scanf("%d %d",&a,&b)!=EOF)
{
checkDifference(a,b);
}
return 0;
}