如何在Javascript中查找两个数字之间的位差

时间:2018-05-23 03:19:56

标签: javascript bit-manipulation

假设我有2个数字,例如它们的二进制表示为'01'和'10',因此它们的位差为2.对于数字5和7,二进制表示将为'101'和'111',因此位差为1.当然我可以转换它们数字为二进制,然后循环它以找到差异,但有任何更简单的方法。??

3 个答案:

答案 0 :(得分:1)

您可以使用按位XOR(^)来识别位不同的位置,将结果转换为字符串,然后计算字符串中1的出现次数:

const bitDiffCount = (a, b) => {
  const bitStr = ((a ^ b) >>> 0).toString(2);
  return bitStr.split('1').length - 1;
};

console.log(bitDiffCount(5, 7));
console.log(bitDiffCount(1, 2));
console.log(bitDiffCount(16, 16));
console.log(bitDiffCount(16, 17));
console.log(bitDiffCount(16, 18));
console.log(bitDiffCount(16, 19));

答案 1 :(得分:1)

您可以结合使用 XOR 和 Brian Kernighan 算法来计算二进制数中的位数。我强烈建议你自己查一下。一个例子如下所示:

int foo( int a, int b ) {
    int c = a ^ b;
    int count;
    while( count ) {
        c &= c - 1;
        count++;
    }
    return count;
}

答案 2 :(得分:0)

1)对两个数字进行异或:x = a^b

2)检查XOR结果是否为2的幂。如果为2的幂,则仅存在1位差。 (x && (!(x & (x - 1))))应该为1

bool differAtOneBitPos(unsigned int a, 
                       unsigned int b) 
{ 
    return isPowerOfTwo(a ^ b); 
}

bool isPowerOfTwo(unsigned int x) 
{ 
    return x && (!(x & (x - 1))); 
}