主要内容:
- Leetcode题目,类型[Bit Manipulation]
- Java语言实现
题目
The Hamming distance between two integers is the number of positions at which the corresponding bits are different.
Given two integers x and y, calculate the Hamming distance.
Note:0 ≤ x, y < 2^31.
Example:
Input: x = 1, y = 4
Output: 2
Explanation:
1 (0 0 0 1)
4 (0 1 0 0)
↑ ↑
The above arrows point to positions where the corresponding bits are different.
实现
代码实现:git地址,可以关注我github地址,持续更新Leetcode代码实现。
题目的意思是,给出两个0到232之间的两个数x和y,计算x、y二进制表示时相同位置上不同比特值的个数。首先肯定想到用**异或,不同数字异或得出的值为1,相同返回0。然后计算异或结果中1的个数**。
第一种
哈哈我第一个想到的方法是将二进制表示的最后一位bit值并上1,来确定最后一位bit值是不是1,然后右移遍历二进制表示直到循环结束。代码如下图所示,不难发现这个方法最坏需要遍历32位bit值,方法效率不高。
public int hammingDistance(int x, int y) {
int xor = x ^ y;
int count = 0;
while(xor != 0){
count += xor & 1;
xor = xor >> 1;
}
return count;
}
第二种
继续想优化方法,主要优化怎样快速获取二进制表示中1的个数。这边先来介绍下一个知识n&(n-1)
。
1.如果n是奇数的话,n的二进制表示的末位是1
n: xxxxx1
n-1: xxxxx0
n&(n-1):xxxxx0
不用管n二进制表示中前几位是什么,会发现n&(n-1)
相当于去掉奇数二进制表示中最后一位1。
2.如果是偶数的话,n的二进制表示的末位是0
n: xxxxx10
n-1: xxxxx01
n&(n-1):xxxxx00
不难发现,二进制表示中最后一个1也被去掉了。
因此,n&(n-1)
非常有用,可以用来统计二进制表示中1的个数!!
public int hammingDistance(int x, int y) {
int xor = x ^ y;
int count = 0;
while(xor != 0){
count ++;
xor = xor & (xor - 1);//计算xor二进制形式中1的个数
}
return count;
}