如果我有一个基本的位掩码......
cat = 0x1;
dog = 0x2;
chicken = 0x4;
cow = 0x8;
// OMD has a chicken and a cow
onTheFarm = 0x12;
...我如何检查是否只设置了一种动物(即一位)?
的值onTheFarm
必须是 2 n,但我如何以编程方式检查(最好在 Javascript 中)?
如果我有一个基本的位掩码......
cat = 0x1;
dog = 0x2;
chicken = 0x4;
cow = 0x8;
// OMD has a chicken and a cow
onTheFarm = 0x12;
...我如何检查是否只设置了一种动物(即一位)?
的值onTheFarm
必须是 2 n,但我如何以编程方式检查(最好在 Javascript 中)?
您可以使用此代码计算在非负整数值中设置的位数(从this answer适应JavaScript ):
function countSetBits(i)
{
i = i - ((i >> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
}
它应该比单独检查每个位更有效。但是,如果符号位设置在i
.
编辑(全部归功于 Pointy 的评论):
function isPowerOfTwo(i) {
return i > 0 && (i & (i-1)) === 0;
}
你必须一点一点地检查,功能或多或少是这样的:
function p2(n) {
if (n === 0) return false;
while (n) {
if (n & 1 && n !== 1) return false;
n >>= 1;
}
return true;
}
一些 CPU 指令集包含“计数集位”操作(古老的 CDC Cyber 系列就是其中之一)。它对于一些实现为位集合的数据结构很有用。如果你有一个作为整数字符串实现的集合,位位置对应于集合数据类型的元素,那么获得基数涉及对位进行计数。
编辑哇看着 Ted Hopp 的回答我偶然发现了这个:
function p2(n) {
return n !== 0 && (n & (n - 1)) === 0;
}
那是来自这个很棒的“技巧”集合。像这样的问题是研究数论的好理由:-)
如果您想查看是否只设置了一个位,您可以利用logarithms,如下所示:
var singleAnimal = (Math.log(onTheFarm) / Math.log(2)) % 1 == 0;
Math.log(y) / Math.log(2)
找到x
in2^x = y
并x % 1
告诉我们是否x
是一个整数。x
如果设置了一个位,则只会是整数,因此只选择了一种动物。