用於優化多狀態資料比較的位欄位

位欄位是一個變數,它將各種布林狀態儲存為單獨的位。一點就意味著真實,而 off 則是假的。在過去,通常使用位欄位,因為它們節省了記憶體並減少了處理負荷。雖然使用位欄位的需求不再那麼重要,但它們確實提供了一些可以簡化許多處理任務的好處。

例如使用者輸入。當從鍵盤的方向鍵向上,向下,向左,向右輸入時,你可以將各種鍵編碼為單個變數,每個方向分配一點。

通過位域讀取鍵盤的示例

var bitField = 0;  // the value to hold the bits
const KEY_BITS = [4,1,8,2]; // left up right down
const KEY_MASKS = [0b1011,0b1110,0b0111,0b1101]; // left up right down
window.onkeydown = window.onkeyup = function (e) {
    if(e.keyCode >= 37 && e.keyCode <41){
        if(e.type === "keydown"){
            bitField |= KEY_BITS[e.keyCode - 37];
        }else{
            bitField &= KEY_MASKS[e.keyCode - 37];
        }
    }    
}

作為陣列讀取的示例

var directionState = [false,false,false,false];
window.onkeydown = window.onkeyup = function (e) {
    if(e.keyCode >= 37 && e.keyCode <41){
        directionState[e.keyCode - 37] = e.type === "keydown";
    }    
}

要開啟一個位,使用 bitwise |和該位對應的值。因此,如果你想設定第二位 bitField |= 0b10 將開啟它。如果你希望稍微關閉,請使用按位 &,其值必須為所需位。使用 4 位並關閉 bitfield &= 0b1101; 的第二位

你可能會說上面的示例似乎比將各種鍵狀態分配給陣列要複雜得多。是設定稍微複雜一點,但是在審問狀態時會有優勢。

如果要測試是否所有鍵都已啟動。

// as bit field
if(!bitfield) // no keys are on

// as array test each item in array
if(!(directionState[0] && directionState[1] && directionState[2] && directionState[3])){

你可以設定一些常量以使事情變得更容易

// postfix U,D,L,R for Up down left right
const KEY_U = 1;
const KEY_D = 2;
const KEY_L = 4;
const KEY_R = 8;
const KEY_UL = KEY_U + KEY_L; // up left
const KEY_UR = KEY_U + KEY_R; // up Right
const KEY_DL = KEY_D + KEY_L; // down left
const KEY_DR = KEY_D + KEY_R; // down right

然後,你可以快速測試各種鍵盤狀態

if ((bitfield & KEY_UL) === KEY_UL) { // is UP and LEFT only down
if (bitfield  & KEY_UL) {             // is Up left down 
if ((bitfield & KEY_U) === KEY_U) {   // is Up only down
if (bitfield & KEY_U) {               // is Up down (any other key may be down)
if (!(bitfield & KEY_U)) {            // is Up up (any other key may be down)
if (!bitfield ) {                     // no keys are down
if (bitfield ) {                      // any one or more keys are down

鍵盤輸入只是一個例子。當你具有必須組合起作用的各種狀態時,位域很有用。Javascript 最多可以使用 32 位作為位欄位。使用它們可以顯著提高效能。他們值得熟悉。