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