前提需备知识:
算法:n&(n-1)是用来求n中1的个数
常用代码形式为:
while(n)
{
count++;
n=n&(n-1); //每次减去1的个数
}
关于该算法的推导可以见http://t.csdnimg.cn/Tld2S,本文就不再赘述
思路:
一:看见题目是二进制格式,就应该想到是有关原码,反码,补码这一块的知识,于此关联的方法有&,|,^,~这些位操作符。
二:因为是要求位不同的个数,将&,|,^,~这些稍微思考一下,就会发现^的特性与本题要求类似——相同为0,不同才为1,所以可以将两个数进行按位异或处理,得到的数的二进制格式中,1就代表不同,0代表相同。
三:想到表示不同位的方法后,就该考虑如何计算统计不同位的个数,又刚好因为1是表示不同位,所以在学过的知识中,算法n&(n-1)就完美解决的求二进制数中1的个数
四:按照思路就可以开始写代码了
答案:
#include <stdio.h>
int main()
{
int a=0,b=0,n=0,count=0;
scanf("%d%d",&a,&b);
n=a^b; //通过按位异或得到不相同的个数1
while(n)
{
count++;
n=n&(n-1); //每次减去1的个数
}
printf("%d\n",count);
return 0;
}