两个int(32位)整数m和n的二进制表达中, 有多少个位(bit)不同?

该博客探讨了如何用C语言解决计算两个32位整数m和n在二进制表示中不同位数的问题。提出了四种方法,包括基于循环、操作符、优化的循环以及使用异或运算的方法,强调了深入理解和巧妙运用操作符的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

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;
}

小结:多思考,总会有更优秀的算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值