实质就是查找出两个二进制中 相同位置上数值不同的 位数
比如 100101
111011
那么结果就为4 ,两个数 中间的四个位置上的数都不相同
我们分两步
1. 通过两个二进制数的异或可以 得到 相同位置上数值不同的位置为1,其他位置为0的数
比如: 100101 ^ 111011 = 11110
2. 通过上面的结果,我们就只需要计算出结果数中 为1 的个数即可
比如: 以上结果就是 4 个1
那么解法方式的区分就主要在于第2步
第一个方法,直接对结果数进行每次模2,判断是否为1,如果是,则累加结果变量,
并将结果数除上2,继续进行,直至结果数变为0,即可查出结果数中为1的个数
class Solution {
public int hammingDistance(int x, int y) {
int res = x ^ y;
int count = 0;
while(res != 0){
int mod = res % 2;
if(mod == 1){
count++;
}
res /= 2;
}
return count;
}
}
第二个方法, 就是循环遍历结果数,每次都与1进行与操作,即可获取结果数最右位是否为1,然后将结果数右移一位,以此类推继续判断,直至结果数变为0,
class Solution {
public int hammingDistance(int x, int y) {
// 异或获取结果数
int res = x ^ y;
// 定义结果变量
int count = 0;
// 循环遍历结果数
while(res != 0) {
// 每次与上1 获取最后边是否为1,进行累加
count += (res & 1);
// 结果数向右移一位
res >>= 1;
}
// 返回结果变量
return count;
}
}
第三个方法,就是每次都去掉结果数最后边的1,就是将结果数与上结果数-1的数,累加结果变量,直至 结果数变成0
class Solution {
public int hammingDistance(int x, int y) {
// 异或获取 不同位的结果数
int res = x ^ y;
// 定义结果变量
int count = 0;
// 循环遍历结果数
while(res != 0) {
// 与上减去1的数去掉最后一位1
res &= (res-1);
// 结果变量累加
count++;
}
// 返回结果变量
return count;
}
}