js 位掩码

定义掩码

const mask0 = parseInt("00000001", 2);
const mask1 = parseInt("00000010", 2);
const mask2 = parseInt("00000100", 2);
const mask3 = parseInt("00001000", 2);
const mask4 = parseInt("00010000", 2);
const mask5 = parseInt("00100000", 2);
const mask6 = parseInt("01000000", 2);
const mask7 = parseInt("10000000", 2);

flags数据

let valueFlags = 1;

检测掩码

console.assert(valueFlags & mask0);

设置掩码flags

valueFlags |= (mask0 | mask1); // valueFlags = valueFlags | (mask0 | mask1)
console.assert(valueFlags & mask0 && valueFlags & mask1);

valueFlags |= mask7; // valueFlags = valueFlags | mask7
console.assert(valueFlags & mask7)

重设(删除)掩码

valueFlags &= ~mask1; // valueFlags = valueFlags & ~mask1
console.assert( !(valueFlags & mask1) )


if (
  valueFlags & mask0 &&
  valueFlags & mask7 &&
  !(valueFlags & mask1) &&
  !(valueFlags & mask2) &&
  !(valueFlags & mask3) &&
  !(valueFlags & mask4) &&
  !(valueFlags & mask5) &&
  !(valueFlags & mask6)
) {
  console.log("success");
}

切换状态

valueFlags ^= mask0;
console.assert(!(valueFlags & mask0));

valueFlags ^= mask0;
console.assert(valueFlags & mask0);

某些API可能将信息储存在指定位

// 从低位到高位,index从0开始
const value = parseInt('1000000000000000000000000000000010000000000000001000000000000000', 2);

// 检测第15位上是否设置了标志
console.assert( value & (1 << 15) )

// 检测第31位上是否设置了标志
console.assert( value & (1 << 31) )

// 检测第63位上是否设置了标志
console.assert( value & (1 << 63) )

在flags中取出指定位数据

let valueFlags = mask0 | mask1 | mask2;

console.log(valueFlags.toString(2)); // 111
console.log((valueFlags & (1 << 1)) === mask1); // true
console.log( (valueFlags >> 1) & 1); // 1 or 0
posted @ 2020-08-26 11:03  Ajanuw  阅读(604)  评论(0编辑  收藏  举报