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