主要內(nèi)容:
- Leetcode題目书闸,類型[Bit Manipulation]
- Java語(yǔ)言實(shí)現(xiàn)
題目
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.
實(shí)現(xiàn)
代碼實(shí)現(xiàn):git地址,可以關(guān)注我github地址利凑,持續(xù)更新Leetcode代碼實(shí)現(xiàn)浆劲。
題目的意思是嫌术,給出兩個(gè)0到232之間的兩個(gè)數(shù)x和y,計(jì)算x牌借、y二進(jìn)制表示時(shí)相同位置上不同比特值的個(gè)數(shù)度气。首先肯定想到用**異或,不同數(shù)字異或得出的值為1膨报,相同返回0磷籍。然后計(jì)算異或結(jié)果中1的個(gè)數(shù)**。
第一種
哈哈我第一個(gè)想到的方法是將二進(jìn)制表示的最后一位bit值并上1丙躏,來(lái)確定最后一位bit值是不是1择示,然后右移遍歷二進(jìn)制表示直到循環(huán)結(jié)束。代碼如下圖所示晒旅,不難發(fā)現(xiàn)這個(gè)方法最壞需要遍歷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;
}
第二種
繼續(xù)想優(yōu)化方法废恋,主要優(yōu)化怎樣快速獲取二進(jìn)制表示中1的個(gè)數(shù)谈秫。這邊先來(lái)介紹下一個(gè)知識(shí)n&(n-1)
。
1.如果n是奇數(shù)的話鱼鼓,n的二進(jìn)制表示的末位是1
n: xxxxx1
n-1: xxxxx0
n&(n-1):xxxxx0
不用管n二進(jìn)制表示中前幾位是什么拟烫,會(huì)發(fā)現(xiàn)n&(n-1)
相當(dāng)于去掉奇數(shù)二進(jìn)制表示中最后一位1。
2.如果是偶數(shù)的話迄本,n的二進(jìn)制表示的末位是0
n: xxxxx10
n-1: xxxxx01
n&(n-1):xxxxx00
不難發(fā)現(xiàn)硕淑,二進(jìn)制表示中最后一個(gè)1也被去掉了。
因此嘉赎,n&(n-1)
非常有用置媳,可以用來(lái)統(tǒng)計(jì)二進(jìn)制表示中1的個(gè)數(shù)!公条!
public int hammingDistance(int x, int y) {
int xor = x ^ y;
int count = 0;
while(xor != 0){
count ++;
xor = xor & (xor - 1);//計(jì)算xor二進(jìn)制形式中1的個(gè)數(shù)
}
return count;
}