Javascript - 打开位

标签 javascript node.js bit-manipulation buffer

我对位和字节、转换概念等有一些了解 - 但没有实际经验。

所以:
我需要将 true 和 false 数组转换为由 1344 位组成的缓冲区(我使用 UDP 数据包发送)。

另一方将逐位评估缓冲区..

由于我是 NodeJs 新手,请随时添加提示或为我指出新的方向。

var arrBinary = new Array(1344);
for(i=0;i<1344;i++)arrBinary[i]=0;    
// some code here, which will turn some of the array's elements to 1

var arrForBuffer = new Array(168);
for(i=0;i<168;i++)arrForBuffer[i]=0;

var x = buffer.from(arr);

/****** the question ******/
// How to change and set arrForBuffer so it will represent the arrBinary Bits state?

最佳答案

您可以像您所说的那样使用一些位移:

// arrForBuffer must be initialized with 0s

for(let i = 0; i < 1344; i++) 
 arrForBuffer[ Math.floor(i / 8) ] += arrBinary[i] << (7 - (i % 8));

例如,arrBinary 的第一位将左移 7 并添加到第一个字节,第二位将左移 6,依此类推。第 8 位将再次左移 7,并添加到第二个字节。

如果将其写为:

,它可能会更具可读性(并且可能更具性能)
 for(let byte = 0; byte < 168; byte++) {
   arrForBuffer[byte] = 
     arrBinary[byte * 8 + 0] << 7 |
     arrBinary[byte * 8 + 1] << 6 |
     arrBinary[byte * 8 + 2] << 5 |
     arrBinary[byte * 8 + 3] << 4 |
     arrBinary[byte * 8 + 4] << 3 |
     arrBinary[byte * 8 + 5] << 2 |
     arrBinary[byte * 8 + 6] << 1 |
     arrBinary[byte * 8 + 7];
 } 

关于Javascript - 打开位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57289359/

相关文章:

javascript - sequelize.js 中的自定义 json 响应

node.js 初学者教程?

c++ - 如何在假币算法中称重

python - 在数组中执行按位左移操作时超出整数限制

javascript - Java:Java 中 JavaScript localeCompare() 的替代方案是什么?

Javascript - 如何使 getTime() 在所有计算机上统一?

javascript - 在 NodeJS 或 Javascript 中完成例程

输入的 JavaScript 值

node.js - 选择结果后sequelize使用实例方法

c - 解释按位运算符和掩码的直观方法是什么?另外, mask 是做什么用的?