首次尝试使用按位运算符进行标志检查

时间:2019-03-18 16:15:57

标签: javascript binary bit-manipulation bitwise-operators

因此,我最终将尝试在进行一堆标志检查的地方优化我的代码。.我试图通过简单地使用8位代表一个八边形来开始简单工作,我将拥有一个代表“二手面”的8位数字和代表“未使用面”的8位数字

非常直截了当,因为一个八边形方便地拥有8种东西:D

所以我在javascript中拥有的是

let sidesNotInUse = 0b11111111;
let sidesInUse = 0b00000000;

我希望能够编写以下功能

function inUse(sideIndex) {
    // checks that the 1 flag at index is set in sidesInUse
}

function use(sideIndex) {
    if(!(inUse(sideIndex))) {
    // operator to set flag at index in sidesInUse to 1 and sidesNotInUse to 0
  }
}

function unuse(sideIndex) {
    if(inUse(sideIndex)) {
        // operator to set flag at index in sidesInUse to 0 and sidesNotInUse to 1
  }
}

不确定我是否看错了,但是任何帮助都会有用

1 个答案:

答案 0 :(得分:1)

使用掩码,我们可以指定要更改的位。

let mask = 1 << 3;

表示我们要从右边的0000 0 000处更改位置4的位。

基于此,我们可以优化您的inUse()函数以返回 位在特定位置:

function inUse(sideIndex) {
  let mask = 1 << sideIndex;
  if ((sidesInUse & mask) != 0) {
    return true;
  } else {
    return false;
  }
}

使用| (OR)运算符,我们可以将位设置为1,同时使用〜(NOT)的组合 并且&(AND)运算符使我们有能力最终将位设置为0。

function use(sideIndex) {
  let mask = 1 << sideIndex;
  if (!(inUse(sideIndex))) {
    sidesInUse |= mask;
    sidesNotInUse &= ~mask;
  }
}

function unuse(sideIndex) {
  let mask = 1 << sideIndex;
  if (inUse(sideIndex)) {
    sidesInUse &= ~mask;
    sidesNotInUse |= mask;
  }
}

顺便说一句-您实际上并不需要两个二进制数字,一个数字就足以知道是否正在使用一边。