Hamming Distance

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 即可。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值