如何有效地从字节中读取位?

pim*_*vdb 9 javascript parsing byte bit-manipulation node.js

我的工作,包括网页套接字和服务器(Node.js的)和客户端(浏览器)之间的数据使用自定义的数据交换(很简单)格式我设置了发送的项目.

我正在发送3位数据,因为我发送的项目都有8种可能性.数据格式如下所示:

            0          1
bit index   01234567 8901...
item        aaabbbcc cddd...
Run Code Online (Sandbox Code Playgroud)

目前,我正在解析字节中的项目,如下所示:

var itemA = bytes[0] >> 5;
var itemB = (bytes[0] >> 2) & 7;
var itemC = (bytes[0] & 3) << 1 | bytes[1] >> 7;
var itemD = (bytes[1] >> 4) & 7;
Run Code Online (Sandbox Code Playgroud)

就个人而言,这感觉太复杂了.问题是,这只是复杂的,因为我得到以字节为单位,这是8的倍数解析出的3位项目的数据我有位移,做与运算,因为8是不被3整除我有时甚至必须将两个字节的部分组合起来itemC.

将这些数据作为3位组而不是8位组读取会更有效.

我想出的是将所有字节到比特串用.toString(2),然后用.substring得到长度为3子串,并转换回了一些parseInt(bitString, 2),但我想这是不这样做的方式,因为字符串操作很慢,我实际上没有做任何与字符串相关的事情.

是否可以读取例如3的组中的位而不是从字节中解析它们?或者是否有更有效的方法来读取字节外的位?

Mar*_*ans 6

二进制AND和位移操作是执行此操作的最快方法.它们很好地转换为机器代码指令.进一步加快速度的唯一方法是牺牲速度带宽,例如每个字节不要超过3位,但从您的问题判断,您可能已经考虑过并拒绝了这种权衡.