Brian Kernighan 算法

两个整数之间的汉明距离是对应位置上数字不同的位数。

应用:广泛应用于多个领域。在编码理论中用于错误检测,在信息论中量化字符串之间的差异。

优势: 避免逐一遍历

image.png

461. 汉明距离 (经典: 汉明距离)

方法: 按位异或

  1. var hammingDistance = function(x, y) {
  2. let distance = x ^ y;
  3. let count = 0;
  4. while (distance != 0) {
  5. count++;
  6. distance &= (distance - 1);
  7. }
  8. return count;
  9. };

按位异或

  1. 1 & 4 // 0
  2. parseInt(1, 2) & parseInt(4, 2) // 0
  3. 0001 & 0100 // 0
  4. 1 ^ 4 // 5


191. 位1的个数 (经典: 汉明重量)(剑指 Offer 15. 二进制中1的个数)

return~~ parseInt(n, ~~2);
方法: 掩码左移一位

  1. var hammingWeight = function(n) {
  2. let count = 0;
  3. let mask = 1;
  4. for (let i=0; i < 32; i++) {
  5. if ((n & mask) != 0) {
  6. count++;
  7. }
  8. mask <<= 1;
  9. }
  10. return count;
  11. };

移位运算

1 << 1  // 2
2 << 1  // 4

0b1 << 1  // 2
0b10 << 1  // 4

方法:Brian-kenigan算法(布赖恩-克尼根算法) n 按位与 n-1

var hammingWeight = function(n) {
    let count = 0;
    while (n != 0) {
        count++;
        n &= (n-1)
    }
    return count;
};

位运算
从低位的1进行统计, 相比仅遍历到count次, 效率更高

    0110
  & 0101
---------
        0100

方法:二进制

var hammingWeight = function(n) {
   let count = 0;
   while (n > 0) {
       if (n % 2 != 0) {
           count++;
       }
       n = Math.floor(n / 2)
   }
   return count;
};