求二进制中不同位的个数 输入例子 1999 2299 输出为7

#include <stdio.h>
int Numberof1(int a, int b)
{
	int count = 0;
	int n = a^b; // 找不同位的1
	while (n)
	{
		n = n&(n - 1); 
		count++;  //计算不同位1的个数
	}
	return count;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d%d", &a, &b);
	int ret = Numberof1(a, b);
	printf("%d",ret );
	return 0;
}
### 回答1: 可以使用异或操作符和运算符来解两个整的哈密顿距离。具体思路是:将两个整做异或操作,得到一个新的整,然后统计这个新整二进制表示1的个数即可。 以下是示例代码实现: ```java import java.util.Scanner; public class HammingDistance { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int m = sc.nextInt(); int n = sc.nextInt(); int xor = m ^ n; // 两个整做异或操作 int hammingDistance = 0; // 统计xor二进制表示1的个数 while (xor != 0) { if ((xor & 1) == 1) { hammingDistance++; } xor >>>= 1; // 无符号右移一 } System.out.println(hammingDistance); } } ``` 在上述代码,我们首先通过Scanner类获取输入的两个整m和n。然后使用异或操作符^得到一个新的整xor,这个新整二进制表示每个上的值表示原来两个整对应上的值是否相同。接着,我们使用while循环遍历每个,统计xor二进制表示1的个数。在循环,我们使用运算符&来判断每个是否为1,如果是则计器hammingDistance加1,然后使用无符号右移运算符>>>将xor右移一,继续遍历下一。最后,输出hammingDistance即可得到M和N的哈密顿距离。 ### 回答2: 先将给定的两个整转换二进制表示。例如,假设M=5,N=10,那么它们的二进制表示分别为M=0000 0000 0000 0000 0000 0000 0000 0101,N=0000 0000 0000 0000 0000 0000 0000 1010。 接下来,我们需要计算两个二进制的哈密顿距离。哈密顿距离定义为两个数二进制不同个数。 我们可以通过逐比较两个二进制的每一来计算哈密顿距离。如果两个二进制的相应不同,那么哈密顿距离增加1;如果相应相同,哈密顿距离不变。 举个例子,比较M和N的第1时,我们发现它们的值分别为0和0,二者相同,哈密顿距离不变。比较第2时,它们的值分别为0和1,二者不同,哈密顿距离增加1。继续比较后面的,我们可以得到M和N的哈密顿距离。 因此,M和N的哈密顿距离为1。 最后,将计算得到的哈密顿距离输出即可。 值得注意的是,根据题目要,给定的整为32,因此计算哈密顿距离时需要比较32次。 ### 回答3: 要计算两个整M和N的哈密顿距离,可以通过以下步骤实现: 1. 将M和N转换二进制表示。32二进制有32个,每个要么是0,要么是1。 2. 对应置上的二进制进行比较。从最高开始比较,如果对应上的二进制字不相同,则哈密顿距离加1;如果相同,则不加1。 3. 继续比较下一个置上的二进制,直到比较完所有32个。 4. 输出哈密顿距离。 例如,假设输入的整M和N分别为10和15: M的二进制表示为00000000 00000000 00000000 00001010 N的二进制表示为00000000 00000000 00000000 00001111 我们从最高开始比较: 第1:M的二进制为0,N的二进制为0,相同; 第2:M的二进制为0,N的二进制为0,相同; 第3:M的二进制为0,N的二进制为0,相同; 第4:M的二进制为0,N的二进制为0,相同; 第5:M的二进制为1,N的二进制为1,相同; 第6:M的二进制为0,N的二进制为1,不同,哈密顿距离+1; 第7:M的二进制为1,N的二进制为1,相同; 第8:M的二进制为0,N的二进制为1,不同,哈密顿距离+1; ... 第32:M的二进制为0,N的二进制为1,不同,哈密顿距离+1; 因此,M和N的哈密顿距离为3。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值