1.我需要通过JavaScript来用位序列做标志位,来表示相对应的数据块存在或不存在,需要能够存取特定位,能够实现类似shift的移位功能,我知道在32位以内很容易实现,但是我需要实现更大的,比如说1024位(利用arraybuffer),这样在存取特定位上没有问题,但是在移位上却是有问题的,不知道有没有办法能够实现,如果有具体如何,希望能有一些指点,谢谢?(补充一点:移位的时候需要后面的位相应补位,也就是说,我的标志位是对应的一个序列,类似一一个队列的样子,只是里面的元素是通过位来标志值是否存在)
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
可以用
Uint32Array、Uint16Array或者Uint8Array来封装ArrayBuffer来进行处理。按习惯用Uint32Array或Uint8Array合适一些。理论上Uint32Array会更快,但实际上要看 ArrayBuffer 的具体实现,这里不做速度上的比较。然后一般的位操作都直接算 index 就了,只有位移操作的时候需要计算上个位移移出的部分。
Uint8Array实现下面写了一个左移一位的操作,为了简化测试,只字义了4个字节(按字节而不是按整数处理的,所以可以模拟多个单元的情况)
如果需要移多位,对
Uint8Array来说,8位以内,都可以通过位移来算newRest,比如,移3位的情况但是对于移位大于 8 的情况就比较复杂一些了,需要计算 index 偏移(或者 8 位 8 位的移,再处理余下不足 8 位的情况)。
所以总的来说我觉得这个算法还是比较考人的,不过我没搜到合适的 BitInteger 库,只找到一个 没提供位运算的,可以试试通过乘法(×2)和除法(÷2)来实现。
又试验了一下,可以用 Uint32Array 来实现这样操作起来可能会更快一些
输出
1024位 就是 32个 32位整数
用一个32个元素的数组就可以实现
先判断要操作的 位 在哪个整数里,然后对那个数进行左右移位。
我的建议是:由于内存最小的访问单元是字节(byte),所以,用1个字节来表示标志位比较合适。
如果用 位(bit)来表示,每移动1位,就得跨单元修改整个内存块,效率很低。
用字节的话,可以用复合视图来模拟左右移运算,效率高,程序也容易写~
参考:ArrayBuffer:类型化数组
例子:
用有8个元素的作例子