【问题标题】:Attempting to do a flag check with bitwise operators for the first time第一次尝试使用按位运算符进行标志检查
【发布时间】:2019-08-09 01:51:43
【问题描述】:

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

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

    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;
      }
    }
    

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

    【讨论】:

    • 我马上意识到只需要 1 个数字作为标志。这有很大帮助!谢谢。
    • 所以从技术上讲,实际上并不需要 inUse 函数。我可以应用掩码,不管它是否被采用,结果不应该改变..对吗? @obscure
    • 这取决于。如果您不在乎在使用它之前是否取了一点(或因此一侧)并将其设置为 1,则不需要它。 ;) use() 会将任何值设置为 1,而 unuse 会将任何值设置为 0。顺便说一下,如果您使用 ^ (XOR) 运算符,您可以在 0 和 1 之间切换。 sidesInUse ^= mask; 如果位为 0,则将其设置为 1,反之亦然。
    猜你喜欢
    • 1970-01-01
    • 2014-10-05
    • 2013-10-07
    • 2020-07-13
    • 1970-01-01
    • 2012-04-08
    • 2010-10-06
    • 1970-01-01
    • 2020-09-24
    相关资源
    最近更新 更多