如果我有数字"00001000"和掩码"00101000",我如何使用二进制操作来检查数字中的两个位是否都被设置?
number & mask
会返回true,如果至少有一个位匹配,但我需要检查它们是否都匹配。如何实现?number & mask
会返回true,如果至少有一个位匹配,但我需要检查它们是否都匹配。如何实现?与口罩进行比较:
if ((number & mask) === mask) {
// all bits are set!
}
只有当数字的所有位都设置时,&
操作的结果才会与掩码的值完全相同。(测试数字可能有更多的位被设置; 如果你想检查它是否恰好具有相同的位被设置和未设置,那么这是一个简单的等式测试。)
(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