第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何用JavaScript通過位序列做標(biāo)志位(大于32位)

如何用JavaScript通過位序列做標(biāo)志位(大于32位)

湖上湖 2018-10-24 15:13:51
1.我需要通過JavaScript來用位序列做標(biāo)志位,來表示相對應(yīng)的數(shù)據(jù)塊存在或不存在,需要能夠存取特定位,能夠?qū)崿F(xiàn)類似shift的移位功能,我知道在32位以內(nèi)很容易實現(xiàn),但是我需要實現(xiàn)更大的,比如說1024位(利用arraybuffer),這樣在存取特定位上沒有問題,但是在移位上卻是有問題的,不知道有沒有辦法能夠?qū)崿F(xiàn),如果有具體如何,希望能有一些指點,謝謝?(補充一點:移位的時候需要后面的位相應(yīng)補位,也就是說,我的標(biāo)志位是對應(yīng)的一個序列,類似一一個隊列的樣子,只是里面的元素是通過位來標(biāo)志值是否存在)
查看完整描述

1 回答

?
一只萌萌小番薯

TA貢獻1795條經(jīng)驗 獲得超7個贊

之前說 JavaScript 最大支持 31 位的整數(shù),抱歉,說錯了,我用 Number.MAX_SAFE_INTEGER.toString(2).length計算了一下,結(jié)果是 53,也就是說 JavaScript 最大支持 53 位的整數(shù)。因此,我修改了答案。

可以用 Uint32ArrayUint16Array 或者 Uint8Array 來封裝 ArrayBuffer 來進行處理。按習(xí)慣用 Uint32Array 或 Uint8Array 合適一些。理論上 Uint32Array 會更快,但實際上要看 ArrayBuffer 的具體實現(xiàn),這里不做速度上的比較。

然后一般的位操作都直接算 index 就了,只有位移操作的時候需要計算上個位移移出的部分。

Uint8Array 實現(xiàn)

先寫的這個答案,留在這了。后面用 Uint32Array 的實現(xiàn)可能更好一些。

下面寫了一個左移一位的操作,為了簡化測試,只字義了4個字節(jié)(按字節(jié)而不是按整數(shù)處理的,所以可以模擬多個單元的情況)

var buffer = new ArrayBuffer(4);var iBuffer = new Uint8Array(buffer);

iBuffer[0] = 0x03;
iBuffer[1] = 0xf0;console.log(Array.from(iBuffer).map(n => n.toString(2)));// [ '11', '11110000', '0', '0' ]let rest = 0;for
 (let i = iBuffer.length - 1; i >= 0; i--) {    const v = iBuffer[i];    const newRest = (v & 0x80) > 0 ? 1 : 0;
    iBuffer[i] = ((v << 1) | rest) & 0xff;
    rest = newRest;
}console.log(Array.from(iBuffer).map(n => n.toString(2)));// [ '111', '11100000', '0', '0' ]

如果需要移多位,對 Uint8Array 來說,8位以內(nèi),都可以通過位移來算 newRest,比如,移3位的情況

const newRest = v >> (8 - 3);

但是對于移位大于 8 的情況就比較復(fù)雜一些了,需要計算 index 偏移(或者 8 位 8 位的移,再處理余下不足 8 位的情況)。

所以總的來說我覺得這個算法還是比較考人的,不過我沒搜到合適的 BitInteger 庫,只找到一個 沒提供位運算的,可以試試通過乘法(×2)和除法(÷2)來實現(xiàn)。

又試驗了一下,可以用 Uint32Array 來實現(xiàn)這樣操作起來可能會更快一些

var buffer = new ArrayBuffer(16);var iBuffer = new Uint32Array(buffer);

iBuffer[0] = 0x03;
iBuffer[1] = 0x8f000000;console.log(Array.from(iBuffer).map(n => n.toString(2)));// bits 需要小于32function shift(buffer, bits) { 
   let rest = 0;    for (let i = iBuffer.length - 1; i >= 0; i--) {        const v = iBuffer[i];       
    const newRest = v >>> (32 - bits);
        iBuffer[i] = ((v << bits) | rest) & 0xffffffff;
        rest = newRest;
    }
}

shift(iBuffer, 5);console.log(Array.from(iBuffer).map(n => n.toString(2)));

輸出

[ '11', '10001111000000000000000000000000', '0', '0' ]
[ '1110001', '11100000000000000000000000000000', '0', '0' ]


查看完整回答
反對 回復(fù) 2018-11-04
  • 1 回答
  • 0 關(guān)注
  • 531 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號