第一次尝试使用按位运算符进行标记检查

问题描述 投票:0回答:1

所以我最终会尝试优化我的代码,我正在做一堆标志检查。我试图通过简单地使用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
  }
}

不确定我是否错误地看着这个,但任何帮助都会有用

javascript binary bit-manipulation bitwise-operators
1个回答
1
投票

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

let mask = 1 << 3;

意味着我们想要从右边00000000改变位置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;
  }
}

顺便说一下 - 你真的不需要两个二进制数,一个就足以知道一个侧面是否正在使用。

© www.soinside.com 2019 - 2024. All rights reserved.