问题描述:
4编程实现:
两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
输入例子:
1999 2299
输出例子:
7
问题分析:
方法一:
1、从键盘读入两个数;
2、通过运算求得相应二进制数,并存入两个大小相同的数组;
3、通过两个数组每一位的比较,求得count。
方法二:
1、从键盘读入两个数;
2、比较两个数,取得最大值,通过最大数二进制每次除以2求得一共多少bit位;(计算机以二进制形式存储)
3、求得的数字作为循环次数,进行比较循环;
4、两个数同时每次右移 i 位,再与 1 相与(&),最后判断两个数的最后一个 bit 位是否相等;(核心思想)
5、设置计数器,统计不想等位数。
方法三:
1、从键盘读入两个数;
2、比较两个数,取得最大值;
3、当 i > 0 进行循环比较,同方法二第四步;
4、通过最大数二进制每次除以2求得一共多少bit位,每除一次就会少一位,当 Max = 0 时,循环退出;
5、设置计数器,统计不想等位数。
方法四:
1、从键盘读入两个数;
2、a^b (二进制相^,不同位变成1);
3、统计1的个数。
源代码:
方法一:(循环)
容易想到,方法简单
代码冗杂,时间空间复杂度大
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[32] = { 0 };
int b[32] = { 0 };
int i = 0;
int count = 0;
int num1 = 0;
int num2 = 0;
printf("请输入两个数:");
scanf("%d %d", &num1,&num2);
//换算num1及输出二进制
for (i = 31; num1 != 0; i--)
{
a[i] = num1 % 2;
num1 /= 2;
}
//换算num2及输出二进制
for (i = 31; num2 != 0; i--)
{
b[i] = num2 % 2;
num2 /= 2;
}
printf("Num1二进制为:");
for (i = 0; i < 32; i++)
{
printf("%d", a[i]);
}
printf("\n");
printf("Num2二进制为:");
for (i = 0; i < 32; i++)
{
printf("%d", b[i]);
}
printf("\n");
for(i=0;i<32;i++)
{
if(a[i] != b[i])
count++;
}
printf("一共 %d 个不同bit位",count);
return 0;
}
方法二:(操作符)
代码简单,方法优秀
深刻理解操作符,并会运用,比较难想到
#include <stdio.h>
#include <windows.h>
#pragma warning (disable: 4996)
int main()
{
int a = 0;
int b = 0;
printf("请输入两个数:");
scanf("%d %d", &a, &b);
int max = a > b ? a : b;//三目运算符求最大值
int count = 0;
while (max)//求得循环次数
{
max /= 2;
count++;
}
int i = 0;
int sum = 0;
for (i; i <= count;i++)
{
if (((a >> i)&1) != ((b >> i)&1))//判断最低bit位是否相等
{
sum++;
}
}
printf("不相等bit位共%d个\n", sum);
system("pause");
return 0;
}
方法三:(对方法二的优化)
把循环放在一起,减少了时间空间复杂度
属于高阶思维
#include <stdio.h>
#include <windows.h>
#pragma warning (disable: 4996)
int main()
{
int a = 0;
int b = 0;
printf("请输入两个数:");
scanf("%d %d", &a, &b);
int max = a > b ? a : b;//三目运算符求最大值
int i = 0;
int sum = 0;
for (i; i >= 0;i++)
{
if (((a >> i)&1) != ((b >> i)&1))
{
sum++;
}
max /= 2;//每次减少一位,当为0时循环退出
if (max == 0){
break;
}
}
printf("不相等bit位共%d个\n", sum);
system("pause");
return 0;
}
方法四:(异或)
更简洁
#include <stdio.h>
#include <windows.h>
#pragma warning (disable: 4996)
int main()
{
int a = 0;
int b = 0;
printf("请输入两个数:");
scanf("%d %d", &a, &b);
int c=a ^ b;
int count = 0;
while (c)
{
c = c&(c - 1);
count++;
}
printf("不相等bit位共%d个\n", count);
system("pause");
return 0;
}