美文网首页
461. Hamming Distance

461. Hamming Distance

作者: 丁木木木木木 | 来源:发表于2017-03-20 11:11 被阅读30次

    主要内容:

    • 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

          本文链接:https://www.haomeiwen.com/subject/uhebnttx.html