The Hamming distance between two integers is the number of positions at which the creesponding bits are different.
Given two integers x and y, culculate the Hamming distance.
读完题目,首先想到的是将x,y均转化为二进制的字符串后,比较两字符串的长度;然后在较短的字符串前补齐 ‘0’ ;最后再进行一次遍历比较两字符串在相同下标值处的字符是否相同,就可得出distance值,代码如下:
var hammingDistance = function(x, y) {
var string1 = x.toString(2);
var string2 = y.toString(2);
var distance = 0;
if(string1.length > string2.length){
for(var i = 0; i<string1.length; i++){
if(!string2[i]) string2 = '0' + string2;
}
} else {
for(var j = 0; j<string2.length; j++){
if(!string1[i]) string1 = '0' + string1;
}
}
for(var k = 0; k < string1.length; k++){
if(string1[k] !== string2[k]){
distance++;
}
}
return distance;
};
这样的实现方式无疑是繁琐的,究根结底,我们最终比较的不过是两个二进制字符串在相同位的字符是否相同的问题,而异或运算正好是判断a , b两值是否相同(异或运算符号为‘^’),若相同异或结果为‘0’,不同则为‘1’,所以实现代码如下:
var hammingDistance = function(x, y) {
var distance = 0;
var num = (x^y).toString(2);
for(var i = 0; i < num.length; i++){
if(num[i] === '1') distance++;
}
return distance;
};
当然,还有更好更接近计算机底层的方式,如下:
var hammingDistance = function(x, y) {
var nSum = 0;
var nNum = x ^ y;
while (nNum) //当nNum不为0时
{
if (nNum & 1) //取末尾进行与运算,当在相同位两数的值均为1时
nSum++;
nNum = nNum >> 1; //将nNum右移一位
}
return nSum;
};
今天主要想记录的还是最后一种方法:
1、移位运算符(‘>>’ , '<<')
移位运算符是在二进制的基础上对数字进行平移,'<<'左移,‘>>’右移,移出位被丢弃;
左移会在右边空位补‘0’,右移会在左边空位补‘0’;
左移一位的最终结果等于将原来的数字乘‘2’的结果,所以可以用在需要将数据乘2的场合中;
2、&与运算
参与运算的两个数据,按二进制进行与运算,两数同时为‘1’时结果才为‘1’,否则结果为‘0’;
与运算可以用于取一个数中指定位的时候,例如:
x = 1 0 0 1 0 1 0 1,
取x的第第三位 : x & 0 0 0 0 0 1 0 0 即可。