- 对两个数执行二进制异或操作(^),然后计算结果中二进制 1 的数量即可
impl Solution {
pub fn hamming_distance(x: i32, y: i32) -> i32 {
let mut z = x^y;
let mut res = 0;
while z > 0 {
res += z % 2;
z = z / 2;
}
res
}
}
后来看了别人的答案,发现还有一个更简洁的写法,不过性能好像没有提升
impl Solution {
pub fn hamming_distance(x: i32, y: i32) -> i32 {
// count_ones() 和 count_zeros() 可以分别计算二进制中 1 和 0 的数量
// 相关的 api 还有 leading_zeros 和 trailing_zeros 等
(x ^ y).count_ones() as i32
}
}
assert_eq!(hamming_distance(1, 4), 2);
assert_eq!(hamming_distance(1, 3), 1);
assert_eq!(hamming_distance(1, 1073741824), 2);
assert_eq!(hamming_distance(0, 1073741823), 30);
assert_eq!(hamming_distance(1073741824, 1073741823), 31);