Estaba escribiendo un algoritmo para comparar cuántos bits son diferentes entre 2 números usando esta función
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; }; Pero mi resultado siempre es 1 menos que la respuesta correcta, y resulta que mi función es incorrecta al comparar el dígito más a la izquierda, como 0011 y 0100 . Devuelve 2 en lugar de 3.
https://i.imgur.com/P46RyZr.png
Puedo usar XOR en lugar de !== para obtener la respuesta correcta. Pero me pregunto ¿por qué?
Su problema es que !== tiene una precedencia más alta que & . Entonces su condición es en realidad (x & (1 !== y)) & 1 . Utilice la agrupación explícita en su lugar:
if ((x & 1) !== (y & 1)) result++; Funciona con ^ porque tiene una precedencia menor que & .