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;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,779评论 0 33
  • 原文首发于 baishusama.github.io,欢迎围观~肝不动业务代码的时候,就时不时地做个题吧/w\ 题...
    白蜀黍阅读 251评论 0 0
  • 这么多年下来,好像没什么人曾真正出现在我生命中,他们总是在我的生活中飘过,然后回过头会叹息,如果曾经的我主动点他们...
    98578354f116阅读 87评论 0 0
  • 好久没有总结了,今天发生了太多事,真心觉得自己太单纯了,要学的太多了,也需要每天去反思和总结,让自己变得更优秀和更...
    Abbya阅读 455评论 0 0
  • 紧紧跟随自己的脚步,偶尔看看周围的风景,不被别人的步伐打乱,不为别人的琐事烦忧,我喜欢成为我自己喜欢的样子,也许...
    Hcaep倒过来是桃阅读 118评论 0 0