用于优化多状态数据比较的位字段

位字段是一个变量,它将各种布尔状态保存为单独的位。一点就意味着真实,而 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 位作为位字段。使用它们可以显着提高性能。他们值得熟悉。