[编程题]两个整数二进制位不同个数
来源:牛客网
题目描述:
输入两个整数,求两个整数二进制格式有多少个位不同
输入
22 33
输出
5
方法一:
思路:利用 按位与运算 和 右移运算符。
我们都知道 一个数 与 数字 1 按位与 的结果只有两种:0和1 , 把 一个数 和数字1 按位与,如果得到的结果是 0 , 则说明这个数字的补码的最低位是 0 。 一个数 和 数字 1 按位与 ,如果得到的结果是1 ,则说明这个数字的补码的最低位是1。 对于解这个题,我们可以把这两个数(补码)均 右移相同位数(从右移0位到右移31位),然后分别与 1 按位与 ,比较它俩的结果是否相等。
# include <stdio.h>
int main(void)
{
int m, n;
scanf("%d%d", &m, &n);
int count = 0;
int i = 0;
for (i = 0; i < 32; i++)
{
if (((m >> i) & 1) != ((n >> i) & 1))
count++;
}
printf("%d", count);
return 0;
}
方法二:
采用 异或 和 n&(n-1)
思路: 我们可以 对这两个数先进行 异或操作,通过异或操作,两个数字的二进制补码中 不同的位 异或结果是1,相同的位异或结果是0,从而得到一个新的数,我们知道 n&(n-1) ,它的作用就是 把一个数 的二进制补码中的1的最低位改为0,我们可以对这个数字进行n&(n-1) 操作,直到这个数字变为0,记录进行了多少次,进行的次数也就是这个数的补码当中1的个数,也就是 两个数的补码中不同位的个数。
代码实现:
# include<stdio.h>
int main(void)
{
int m, n;
scanf("%d%d", &m, &n);
int count = 0;
int temp = m ^ n;
while (temp)
{
temp = temp & (temp - 1);
count++;
}
printf("%d\n", count);
return 0;
}