首先附上题目链接: https://leetcode-cn.com/problems/hamming-distance/
一:题目
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。给出两个整数 x 和 y,计算它们之间的汉明距离。
注意:0 ≤ x, y < 231.
示例:
输入: x = 1, y = 4
输出: 2
解释:
1 (0 0 0 1)
4 (0 1 0 0)
↑ ↑
上面的箭头指出了对应二进制位不同的位置。
简单说明:这里就是要我们求两个数对应的二进制,有多少个位置的1是单独的,这里的单独意思是指两个数在某个位置是(0,1)形式存在,那这个1就是单独的。
需要注意的是它给的x,y的范围,所以我们的变量只需要int就行了。
二:方法(c++)
1:方法一:直接移位,每次取两个的最后一位进行判断
这种二进制的题目,首先想到的就是能不能移位和亦或,或,与等操作。这里将每个数的最后一位比较,若是一个为0,一个为1则计数。
int count=0; while(x!=0||y!=0) { if((x&1)!=(y&1)) { count++; } x>>=1; y>>=1; } return count ;
2:方法二:汉明重量加汉明距离
这里首先需要介绍这两个概念。汉明重量:某个数二进制中1的数量。 汉明距离:二进制位不同的位置的数目(就如题目所说,对应1的位置不同的数目)。
汉明重量:n=n&(n-1)
这里以6为例子:0110
第一次;0110&0101=0100 :将最后一个1去掉了
第二次:0100&0011=000 :将最后一位去掉了
汉明距离:本质为两个数异或后字符"1"的个数,可以直接使用异或实现。
所以这里我们首先异或算出哪些地方不同位置1。然后使用汉明重量,一次次统计异或得出的二进制里面1的个数。
int hammingDistance(int x, int y) { //汉明距离加重量 int sum=x^y;// 异或来判断哪些不相同的,待会就是把不相同的一个个判别出来 int count=0; while(sum!=0) { sum=sum&sum-1;//依次去掉一 count++; } return count; }