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

我先来讲一讲这道题的大概意思:假设我们输入的是 0 和 1:

0的32位二进制中为:000……0(32位)  1的32位二进制中为:000……1(32位)  

那么就有一位不同。

方法一:

既然是二进制中,那么就是满二进一,就像我们十进制一样的,满十进一。那么在十进制中我们怎样比较两个数的位数不同呢?是不是把数%10后比较两个值,然后/10再看看下一位,那么对于二进制中呢,我们也是同样的方法,只不过我们此时是以2为讨论对象了。那么我们就像十进制那样做了:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int m = 0;
	int n = 0;
	int count = 0;
	scanf("%d %d", &m, &n);

		while (m+n != 0)//
		{
			if (((n % 2) != (m % 2)))
			{
				count++;
			}
				n /= 2;
				m /= 2;
		}
		printf("%d", count);

	return 0;
}

 注意是m+n!=0

方法二:

再讲第二种方法之前,我先来讲一讲按位与&和右移操作符>>和按位异或^的运算规则:

按位异或(2进制)^:相同为0,相异为1

按位与(2进制)&:对应的二进制位进行与运算,只要有0就是0,两个同时为1才是1!

右移操作符 >>:逻辑右移:左边用0填充,右边丢弃

                           算数右移:左边用原该值的符号位填充,右边丢弃

这里只是讲到运算规则,如果想了解更深,之后我会发一篇详细的,欢迎来看哦!

int main()
{
	int m = 0;
	int n = 0;
	int count = 0;
	scanf("%d %d", &m, &n);

	for (int i = 0; i < 32; i++)
	{
		if ((((n >> i) & 1) ^ ((m >> i) & 1)) == 1)
		{
			count++;
		}
	}
	printf("%d", count);

	return 0;
}

上述的代码中,我们通过移位然后按位与上1,那么前面的31为都变成了0,就看最后一位了,两个数的最后一位按位异或,如果结果为1的话,那么说明该位置的两数不相等,那么计数器就加一,直至移完为止!

方法三:

我们先将m和n进行按位异或,此时m和n的相同二进制比特位变为0,不同的二进制比特位为1.
之后我们再计算里面有多少个1就可以了。那怎样计算里面有多少个1呢?
我们可以通过 n = n&(n-1).


假设n = 15
把n的二进制中最右边的1去掉了
 1111 - n   1110 - n-1   1110 - n  1101 - n-1  1100 - n  1011 - n-1  1000 - n   0111 - n-1   0000 - n这样我们可以通过计算的此数来判断里面有多少个1.
int Count_bit(int n, int m)
{
	int tmp = n ^ m;
	int count = 0;
	while (tmp)
	{
		tmp = tmp & (tmp - 1);
		count++;
	}
	return count;
}
int main()
{
	int n = 0;
	int m = 0;
	scanf("%d %d", &m, &n);
	int ret = Count_bit(m, n);
	printf("%d", ret);

	return 0;
}

那么表示22和33中有5为不同,如果不相信可以试着去写出来比较一下哦。

you get到里面的点了吗?

😄😄😄

好了,今天就到此结束了,拜拜!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

并不会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值