很简单
将两个数按位异或(有为,同为)
再统计这个异或中的个数
共有三种方法统计二进制中的个数
1、这个数循环按位于比它小1的数
按位于(同为,其余为)
直到这个数为为止
2、把这个数的每一个二进制位拿出来
与相与移位循环知道这个数为
3、模除直至这个数为为止
方法一:
#include <stdio.h>
int main()
{
int m = 0;
int n = 0;
int q = 0;
int i = 0;
int count = 0;
printf("请输入两个数字\n");
scanf("%d%d",&m,&n);
q = m ^ n;//两个数按位异或,对应不同则会置1
while (q)
{
q = q & (q-1);
count ++;
}
printf("count = %d",count);
return 0;
}
方法二:直接把两个数的二进制序列相比较(与1相与移位循环)
不一样时count++ 最后统计count的个数
#include <stdio.h>
int main()
{
int m = 0;
int n = 0;
int count = 0;
int i = 0;
printf("请输入两个数字\n");
scanf("%d%d",&m,&n);
for (i = 0; i <32; i ++)
{
if (((m >> i) & 1) != ((n >> i) & 1))//从最低为开始每输出一位不同,count+1
{
count ++;
}
}
printf("%d \n",count);
return 0;
}
方法三:模2除2法
代码比较简单
我比较懒
所以
不写了
自己感受一下