本文适合C语言初学者,请自行判断是否观看
各位读者好,今天我们来处理“两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?”这样的问题。
目录:
- 问题的说明
- 解题的思路
- 解题过程
- 完整代码
1.问题的说明
众所周知,int类型的大小是四个字节,对应32位。若在其中存放数字,就会得到一串有三十二个0或者1组成的二进制数字。如10,其32位二进制数字位“00000000000000000000000000001010”,而在本题中,我们要做的就是将其与另外一串二进制数字作比较,得出两串数字的每一位是否相同,不相同则计数。
2.解题的思路
这道题可能有很多解法,本文我们介绍其中一种,即使用位操作符来解题。按位与“&”的口诀是著名的“二者皆真即为真,其他全部都是假”(我自己编的♪(^∇^*) )。我们可以将两串数字分别按位与1,其结果只有一种0000~~001或者0000~~000,因此如果两串数字的那一位相同,则其与1的按位与结果必然相同,于是思路便打开了。
3.解题过程
首先我们创建main函数,定义整型m,n,
int m = 0;
int n = 0;
scanf("%d %d", &m,&n);
分别将m和n按位与1
int a = m & 1;
int b = n & 1;
判断结果,如果a和b不等,则进行下列操作,
if (a != b)
{
count++;
m >>= 1;
n >>= 1;
}
count计数,m和n都向右移一位。(去掉数字右边一位,左边加0)
反之,如下
else
{
m >>= 1;
n >>= 1;
}
因为这些语句要执行多次,所以这里可以采用while循环
while (m != 0 || n != 0)
最后打印count的数值
printf("%d", count);
结束。
4.完整代码
int main()
{
int m = 0;
int n = 0;
scanf("%d %d", &m,&n);
int count = 0;
while (m != 0 || n != 0)
{
int a = m & 1;
int b = n & 1;
if (a != b)
{
count++;
m >>= 1;
n >>= 1;
}
else
{
m >>= 1;
n >>= 1;
}
}
printf("%d", count);
return 0;
}
最后,欢迎各位读者的批评和建议!!