题目
我的题解
方法一:转化成字符串
都转换成二进制字符串,使位数相同,再对应比较。
class Solution {
public int hammingDistance(int x, int y) {
String xStr = Integer.toBinaryString(x);
String yStr = Integer.toBinaryString(y);
int diff = xStr.length() - yStr.length();
if (diff > 0) {
for (int i = 0; i < diff; i++) {
yStr = '0' + yStr;
}
} else {
for (int i = diff; i < 0; i++) {
xStr = '0' + xStr;
}
}
int count = 0;
for (int i = 0; i < xStr.length(); i++) {
if (xStr.charAt(i) != yStr.charAt(i)) {
count++;
}
}
return count;
}
}
方法二:比较余数
利用二进制的特点,将两数都做对2的取余操作,余数不相等说明该位数字不同。此方法无需建立新的字符串也避免了很多循环,在用时和内存消耗上的性能远大于方法一。
class Solution {
public int hammingDistance(int x, int y) {
int count = 0;
while (x != 0 || y != 0) {
if (x % 2 != y % 2) {
count++;
}
x /= 2;
y /= 2;
}
return count;
}
}
其他题解
其实就是位运算中的异或运算^
,可使用Integer.bitCount(x^y)
来算出异或运算后值为1的个数。详情查看解法链接。
布赖恩·克尼根算法
找到1不需要一位一位移动,使用x&(x-1)
每次就能直接找到最右边的1的存在。详情查看解法链接。
总结
- 几个常用位运算符:
&
与|
或^
异或~
非>>
右移<<
左移>>>
右移(高位补零)