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前执行次数来完成

浙公网安备 33010602011771号