Ах, строковый оператор - это простой способ сделать это в соответствии с ответом CertainPerformance, но здесь чисто побитовое решение.
Это плоский цикл, который обрабатывает ограниченную поддержку 32-битных int в JavaScript.
// implementation of the "bit population count" operation for 32-bit ints
function popcount(u) {
// while I'm at it, why not break old IE support :)
if ( !Number.isInteger(u) )
throw new Error('Does not actually work with non-integer types.');
// remove the above check for old IE support
u = (u & 0x55555555) + ((u >> 1) & 0x55555555);
u = (u & 0x33333333) + ((u >> 2) & 0x33333333);
u = (u & 0x0f0f0f0f) + ((u >> 4) & 0x0f0f0f0f);
u = (u & 0x00ff00ff) + ((u >> 8) & 0x00ff00ff);
u = (u & 0x0000ffff) + ((u >>16) & 0x0000ffff);
return u;
}
// select all bits different, count bits
function diffcount(a, b) {
return popcount( a ^ b );
}
// powers of two are single bits; 128 is common, bits for 16, 32, and 8 are counted.
// 128+16 = 144, 128+32+8 = 168
console.log(diffcount(144,168)); // = 3
// -1 is 4294967295 (all bits set) unsigned
console.log(diffcount(-1,1)); // = 31
// arbitrary example
console.log(diffcount(27285120,31231992)); // = 14
Если вам нужны сколь угодно большие значения, дайте мне знать ...
Это потребует использования типизированных массивов, вышеуказанных функций ицикл.