两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x 和 y,计算它们之间的汉明距离。
注意:
0
≤
x
,
y
<
2
31
.
0 ≤ x, y < 2^{31}.
0≤x,y<231.
示例:
输入: x = 1, y = 4
输出: 2
解释: 1 (0 0 0 1)
\space \space \space \space \space \space \space \space 4 (0 1 0 0)
\space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space ↑ \space \space ↑
解法一:
class Solution {
public:
int hammingDistance(int x, int y) {
int m1=min(x,y); # 取x,y中的较小值
int m2=max(x,y); # 取x,y中的较大值
int res=0; # 用于统计不同的位数的数量
while(m2!=0){ # 如果较大的值不为零
int t1=(m1&1); # 将m1与1做位与处理,m1的二进制的最后一位为1,则返回1,否则返回0
int t2=(m2&1); # 将m2与1做位与处理,m2的二进制的最后一位为1,则返回1,否则返回0
if(t1!=t2) # 如果最后一位不相同,则将res++
{
res++;
}
m1>>=1; # 将m1进行右移处理,也可以视为m1 = m1 / 2
m2>>=1;
}
return res;
}
};
解法二:
class Solution {
public:
int hammingDistance(int x, int y) {
int a[32]={0}; #因为最大位数为32,创建一个32位的数组,初始化为0
int b[32]={0}; #同上
int index = 0; #创建一个变量,用于将数据存储到上面的数组中
while((x/2)!=0) #当x大于2时
{
a[index] = x%2; #将x和2的余放进数组中
x = x/2; # x相当于进行右移操作,即除于2
index++; #索引地址递增
}
a[index] = x; # 切记不能把小于2之后的最后一部分漏掉
index = 0; # 置0,便于对y进行一样的操作
while((y/2)!=0)
{
b[index] = y%2;
y = y/2;
index++;
}
b[index] = y;
int num = 0; # 用于存储x和y的不同位的数量
for(int i=0;i<32;i++) # 用于变量32位数组中不同的个数
{
if(a[i]!=b[i])
num++;
}
return num;
}
};