如何在JavaScript中对任意长的位序列进行弹出计数或计数位

时间:2019-03-10 23:24:42

标签: javascript bit-manipulation

对于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
}

我想知道如何在任何大小的位流上有效地对比特进行有效计数,理想情况下不转换为字符串。

2 个答案:

答案 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

当然,表代也可以使用您的魔术。