题目:
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x 和 y,计算它们之间的汉明距离。
注意:
0 ≤ x, y < 231.
示例:
输入: x = 1, y = 4 输出: 2 解释: 1 (0 0 0 1) 4 (0 1 0 0) ↑ ↑
思路:
两个数字对应二进制位不同的位置的数目。我们应该想到异或(XOR)位运算,当且仅当输入位不同时输出为1。
计算 x
和 y
之间的汉明距离,可以先计算 x XOR y
,然后统计结果中等于 1 的位数。
方法一:
大多数编程语言中,都存在各种内置计算等于 1 的位数函数。比如 Java 中的 Integer.bitCount() ,Golang 中的 bits.OnesCount()
//go func hammingDistance(x int, y int) int { xor := x ^ y return bits.OnesCount(uint(xor)) }
方法二:
第一种方法虽然简单易写,在项目中写没有问题。但是如果在面试中,面试官可能就是要考查我们位计数,所以我们可以用移位操作来实现。
为了计算等于 1
的位数,可以将每个位移动到最右侧,然后检查该位是否为 1
。
更准确的说,应该进行逻辑移位,移入零替换丢弃的位。
这里采用右移位,每个位置都会被移动到最右边。移位后检查最右位的位是否为 1 即可。检查最右位是否为 1,可以使用取模运算(i % 2
)或者 AND 操作(i & 1
),这两个操作都会屏蔽最右位以外的其他位。
//go func hammingDistance(x int, y int) int { xor := x ^ y dis := 0 for xor != 0 { if xor & 1 == 1 { dis += 1 } xor = xor >> 1 } return dis }