1题目
计算两个整数 m
和 n
的二进制表示中不同位的数量
2解题思路
-
count_dff
函数:- 该函数接收两个整数参数
m
和n
,并返回它们二进制表示中不同位的数量。 count
变量用于记录不同位的数量,初始化为 0。for
循环从 0 到 31 进行迭代,因为在大多数常见的系统中,int
类型是 32 位的。- 在每次循环中,通过右移操作
(m >> i)
和(n >> i)
将m
和n
的第i
位移动到最低位,然后使用按位与操作& 1
提取最低位的值。 - 如果
m
和n
的第i
位不同,则((m >> i) & 1) != ((n >> i) & 1)
条件成立,count
加 1。 - 最后返回
count
。 -
main
函数:- 定义两个整数变量
m
和n
,用于存储用户输入的两个整数。 - 使用
scanf
函数从标准输入读取两个整数,并分别存储到m
和n
中。 - 调用
count_dff
函数计算m
和n
的二进制表示中不同位的数量,并将结果存储在ret
变量中。 - 使用
printf
函数将结果输出到标准输出。 -
返回 0 表示程序正常结束。
- 定义两个整数变量
- 该函数接收两个整数参数
3解法一
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int count_dff(int m, int n)
{
int count = 0;
int i = 0;
for (i = 0;i < 32;i++)
{
if (((m >> i) & 1) != ((n >> i) & 1))
count++;
}
return count;
}
int main()
{
int m = 0;
int n = 0;
scanf("%d %d",& m,& n);
int ret = count_dff(m, n);
printf("%d", ret);
return 0;
}
4 解法二
可以使用异或操作 ^
来简化代码,异或操作会将两个数的不同位设置为 1,相同位设置为 0。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int count_dff(int m, int n)
{
int xor_result = m ^ n;
int count = 0;
while (xor_result)
{
count++;
xor_result &= (xor_result - 1);
}
return count;
}
int main()
{
int m = 0;
int n = 0;
scanf("%d %d", &m, &n);
int ret = count_dff(m, n);
printf("%d", ret);
return 0;
}