461.汉明距离

思路:题目要求统计俩个整形的数字不同二进制位的数目,直接模拟操作
代码

class Solution {
public:
    int hammingDistance(int x, int y) {
        int line;
        x=(x<<1);//去除int的符号位置
        y=(y<<1);
        line = x^y;//x、y按位异或、不同的位置的数则1;
        unsigned v(1);//二进制位标记位v,用以统计1(不同位置)的个数
        int sum(0);
        for(auto max=sizeof(line)*8;max!=0;--max)//将v所标记的位置诸位从低位向高位移动,统计1的个数
        {
            unsigned pre=v;//用以暂存v
            v=(v&line);//检查v所标记的位置是否为1,(与运算保留当前位置的值)
            if(v!=0)//为1则说明改两个数二进制在此处不同
                sum++;
            v=(pre<<1);//向高位移动1位v
        }
        return sum;
    }
};

讨论区[https://leetcode.com/problems/hamming-distance/discuss/94705/My-C++-solution-using-bit-manipulation]
范例代码

class Solution {
public:
    int hammingDistance(int x, int y) {
        int dist = 0, n = x ^ y;
        while (n) {
            ++dist;
            n &= n - 1;
        }
        return dist;
    }
};

反思:1、统计某个值的二进制有多少位置1,可以考虑采用统计n&=n-1的为0前执行次数来完成

posted @ 2018-10-02 23:51  Kipper  阅读(125)  评论(0)    收藏  举报