对于JavaScript中最大整数大小以内的整数,它看起来效果很好:
function bitCount (n) {
var bits = 0
while (n !== 0) {
bits += bitCount32(n | 0)
n /= 0x100000000
}
return bits
}
function bitCount32 (n) {
n = n - ((n >> 1) & 0x55555555)
n = (n & 0x33333333) + ((n >> 2) & 0x33333333)
return ((n + (n >> 4) & 0xF0F0F0F) * 0x1010101) >> 24
}
我想知道如何在任何大小的位流上有效地对比特进行有效计数,理想情况下不转换为字符串。
答案 0 :(得分:1)
如果您知道缓冲区的长度可以被4整除,
let array32 = new Uint32Array(buffer);
let numBits = array32.reduce((a, e) => a + bitCount32(e), 0);
否则,也许特维玛达的建议更好,请使用Uint8Array
并以字节为单位而不是双字来计数位。
答案 1 :(得分:0)
带有查找表的注释,大致为:
var lookup=new Uint8Array(256);
for(var i=0;i<256;i++){
var c=0;
for(var j=i;j;j>>=1)
if(j&1)c++;
lookup[i]=c;
}
function count(arr){
var arr8=new Uint8Array(arr);
return arr8.reduce((a,e)=>a+lookup[e],0);
}
console.log(count(new Uint8Array([0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xF])));
//11 21 22 31 22 32 33 4 = 32
当然,表代也可以使用您的魔术。