C++—汉明距离(比较两个数对应的二进制不同的位置的数目)—计算一个二进制数中有几个 1

题目说明

  两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。给出两个整数 xy,计算它们之间的汉明距离。

  注意: 0 ≤ x,y < 231

  示例:

  输入: x = 1, y = 4

  输出: 2

  解释:
1 (0 0 0 1)
4 (0 1 0 0)
   ↑ ↑

  上面的箭头指出了对应二进制位不同的位置。

解题

题目分析:

  1. 两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目

  这里的意思就是将两个数用二进制表示,然后按位进行比较,记录下对应位置数字不同的数目,比如用它所给的实例:

在这里插入图片描述

解题思路:

  由上图可以看出,将输入的两个数字 xy ,第一步进行异或运算(^),然后得出值 n ,然后对求出 n 的二进制有几个 11 的个数就是 这两个数字对应二进制位不同的位置的数目,也就是汉明距离

  对于如何求 n 有几个 1 ,我这里给出两种方法:

方法一:
// 方法一
n = x^y; //两个数字异或得出来的数,二进制中1的个数就是汉明距离
// t=0; t 记录 n 中有几个 1
for(t;n!=0;t++)
{
	// n 与 (n-1) 进行 & 运算,将得出来的值又赋值给 n
	n &= (n-1); //可以得出 n 中有几个 1
}

在这里插入图片描述
  可以得出 t = 2 ,即汉明距离为 2

方法二:
// 方法二
// 让 n 与 1 相 &,然后 n 向右移动一位
n = x^y; //两个数字异或得出来的数,二进制中1的个数就是汉明距离
while(n!=0)
{
    t += (n & 1); //可以得出n中有几个 1
    n >>= 1;
}

在这里插入图片描述
  可以得出 t = 2 ,即汉明距离为 2

  这两个方法,从原理上看是相似的,你可以根据需要选择其中一种方法。两种方法完整代码如下所示:

//方法一
#include<iostream>

using namespace std;

int main()
{
    int x,y;
    int n=0,t=0;
    cin>>x>>y;
    n=x^y; //两个数字异或得出来的数,二进制中1的个数就是汉明距离
    for(t;n!=0;t++)
    { 
    	// n 与 (n-1) 进行 & 运算,将得出来的值又赋值给 n
        n &= (n-1); //可以得出n中有几个 1
    } 
    cout<<t<<endl;
    return 0;
}

//方法二
#include<iostream>

using namespace std;

int main()
{
    int x,y;
    int n=0,t=0;
    cin>>x>>y;
    n=x^y; //两个数字异或得出来的数,二进制中1的个数就是汉明距离
    while(n!=0)
	{
		// 让 n 与 1 相 &,然后 n 向右移动一位
	    t += (n & 1); //可以得出n中有几个 1
	    n >>= 1;
	}
    cout<<t<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值