啊我摔倒了..有没有人扶我起来学习....
题目
问:输入两个整数,求两个整数二进制格式有多少个位不同?
输入描述:
两个整数
输出描述:
二进制不同位的个数
示例
输入22 33
输出5
解法
1. 确定思路
- 要求出两个整数二进制格式有多少个位不同,既然是二进制,那肯定跟位操作符有关。其中,判断相同或者不同我们采用按位异或操作符(
^
),它的功能是,==相同为0
,相异为1
== - 于是我们就把这两个整数按位异或一下,出现
1
的位,就是不同位 - 最后我们再统计一下
1
的个数就行啦
2. 编写代码
- 按照上述思路,我们先给出主函数部分,输入得到两个整数
int main()
{
int m, n;
while (scanf("%d %d", &m, &n) == 2)
{
printf("%d\n", calc_diff_bit(m, n));
}
return 0;
}
- 为了代码可读性强,我们把核心部分封装成一个函数。按照思路首先是把两个整数按位异或一下,并定义一个
count
用来计算不同位的个数
int calc_diff_bit(int m, int n)
{
int tmp = m ^ n;
int count = 0;
//......
return count;
}
- 重点是如何统计二进制中
1
的个数呢?嘿嘿,我们不是刚学过嘛~《算法 | 妙法统计二进制中1的个数》,咱们就用这种方法来统计!
int calc_diff_bit(int m, int n)
{
int tmp = m ^ n;
int count = 0;
while (tmp)
{
tmp = tmp & (tmp - 1);
count++;
}
return count;
}
输出结果:
- 完美解决~掌握这个方法,在二进制中横着走