位掩码(JavaScript):如何检查所有标志

9
如果我有数字"00001000"和掩码"00101000",我如何使用二进制操作来检查数字中的两个位是否都被设置?number & mask会返回true,如果至少有一个位匹配,但我需要检查它们是否都匹配。如何实现?
1个回答

14

与口罩进行比较:

if ((number & mask) === mask) {
  // all bits are set!
}

只有当数字的所有位都设置时,& 操作的结果才会与掩码的值完全相同。(测试数字可能有更多的位被设置; 如果你想检查它是否恰好具有相同的位被设置和未设置,那么这是一个简单的等式测试。)


2
我想你需要在 (number & mask) 周围加上括号,否则平等测试将会在第一次执行。 - webdeb
其他方法包括(flags | mask) == flags或者((~flags) & mask) == 0)。但是,(flags & mask) == mask是标准用法。https://godbolt.org/z/8P79sz4h3展示了C编译器如何处理它,在某些ISA上,clang会转换为`((~flags) & mask) == 0)`,因为这更有效率。AArch64允许对立即数进行不同的编码,以便进行按位布尔运算,从而允许重复的位模式。在Javascript中,这完全取决于JIT,但本质相同。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接