携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第22天,点击查看活动详情
一、题目描述:
两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。
给你两个整数 x 和 y,计算并返回它们之间的汉明距离。
示例 1:
输入:x = 1, y = 4
输出:2
解释:
1 (0 0 0 1)
4 (0 1 0 0)
↑ ↑
上面的箭头指出了对应二进制位不同的位置。
示例 2:
输入:x = 3, y = 1
输出:1
提示:
- 0 <= x, y <= 2^31 - 1
二、思路分析:
看到两个整数二进制位的不同的位数,就想到是位运算,那位运算怎么算呢?
算不同,第一反应是按位计算异或,然后同时将两个数右移一位,但是按位计算异或怎么搞呢(当时想整体两个数异或,然后移位完全不行),就一直没想到。。。就想那按位看每一位是否相等吧,怎么比较呢,然后想到和1进行相与,这样1每次只代表一位,这样每次我也只对比一位,然后如果两个数和1相与的结果不同,那么count+1,然后每次都要将两个数同时右移一位
但是又想,那二进制位数长度不同怎么办,这个循环的结条件是什么呢,肯定不能是两个都不为0,有可能有一个数上来就一两次次对比之后就为0了,而另一个数还很大,那么就去想循环的结束条件,那肯定是两个数都为0的时候就结束吧,那这样一想,循环的条件就出来了,只要这两个数,有一个不为0,那就要继续下去:while x != 0 or y != 0,那么也就是while x or y
三、AC 代码:
class Solution:
def hammingDistance(self, x: int, y: int) -> int:
count = 0
while x or y:
if (x & 1) != (y & 1):
count += 1
'''同时将x和y向右移一位,而且不能是x>>1,必须是x=x>>1'''
x = x >> 1
y = y >> 1
return count
四、总结:
异或运算符(^):按位异或,将两个数据所有的位进行异或操作并返回,1^1=0 0^0=0 1^0=1
移位操作符(>> <<):>> 右移, << 左移 不要用反
按位与(&):1&1=1 1&0=0 0&0=1