首页 > 解决方案 > 按位 - 为什么 0 & 1 !== 1 & 1 在 VSCode/Leetcode 中返回 false?

问题描述

我正在编写一个算法来使用这个函数比较两个数字之间有多少位不同

 var hammingDistance = function(x, y) {
  let result = 0;
  while (x !== 0 || y !== 0) {
    // This line is incorrect
    if (x & 1 !== y & 1) result++;
    x = x >> 1;
    y = y >> 1;
  }
  return result;
};

但是我的结果总是1小于正确答案,当比较最左边的数字时,我们的函数是错误的,例如0011and 0100。它返回 2 而不是 3。

https://i.imgur.com/P46RyZr.png

我可以使用XOR而不是!==得到正确答案。但我想知道为什么?

标签: javascriptbit-manipulation

解决方案


您的问题是!==优先级高于&. 所以你的条件实际上是(x & (1 !== y)) & 1。改为使用显式分组:

if ((x & 1) !== (y & 1)) result++;

它适用,^因为它的优先级低于&.


推荐阅读