为什么VSCode/力扣中0 & 1 !== 1 & 1返回false?JS汉明距离问题
问题根本原因
你代码出错的核心是JavaScript运算符优先级规则:严格不等运算符!==的优先级高于按位与运算符&,你写的判断语句if (x & 1 !== y & 1)没有按照你预期的逻辑执行。
你原本期望的运算顺序是:分别取x、y的最低位,再比较两个位是否不同,也就是等价于if ((x & 1) !== (y & 1))。但由于优先级差异,实际执行顺序是:
- 先运算
1 !== y,得到布尔类型的结果 - 布尔值会被隐式转换为数字(
true转1、false转0),再和x做按位与运算 - 最后将上一步的结果和1做按位与运算
这个错误的运算逻辑导致很多比特位差异没有被正确统计,所以最终结果会比正确值少,你测试的0011和0100就会漏算最高位的差异,得到2而非3。
修复方案
你可以选择两种方案修复问题:
- 给按位与运算加括号,强制优先级符合预期:
if ((x & 1) !== (y & 1)) result++;
- 用异或运算简化判断逻辑(两个比特位不同时异或结果为1,相同时为0,不需要额外做不等判断):
if ((x ^ y) & 1) result++;
优化写法参考
你还可以先对两个数做异或运算,再统计异或结果里1的个数,就是汉明距离,逻辑更简洁,循环次数更少:
var hammingDistance = function(x, y) { let diff = x ^ y; let count = 0; while (diff) { count += diff & 1; diff >>= 1; } return count; };
内容的提问来源于stack exchange,提问作者Vagrant Coder
相关产品推荐
相关产品推荐

