461. Hamming Distance

主要内容:

  • 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;
    }

你可能感兴趣的:(461. Hamming Distance)