用於優化多狀態資料比較的位欄位
位欄位是一個變數,它將各種布林狀態儲存為單獨的位。一點就意味著真實,而 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 位作為位欄位。使用它們可以顯著提高效能。他們值得熟悉。