位掩码:如何确定是否只设置了一个位

时间:2013-04-11 14:44:10

标签: javascript bitmask bit-masks

如果我有一个基本的位掩码......

cat = 0x1;
dog = 0x2;
chicken = 0x4;
cow = 0x8;

// OMD has a chicken and a cow
onTheFarm = 0x12;

...如何检查是否只设置了一只动物(即一位)?

onTheFarm的值必须为2 n ,但如何以编程方式检查(最好是在Javascript中)?

3 个答案:

答案 0 :(得分:10)

您可以使用此代码计算在非负整数值中设置的位数(适用于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;
}

答案 1 :(得分:2)

你必须一点一点地检查一下,或多或少像这样的函数:

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

那来自this awesome collection of "tricks"。这个问题是研究数论的好理由: - )

答案 2 :(得分:0)

如果您想查看是否只设置了一个位,您可以利用logarithms,如下所示:

var singleAnimal = (Math.log(onTheFarm) / Math.log(2)) % 1 == 0;

Math.log(y) / Math.log(2)x中找到2^x = yx % 1告诉我们x是否为整数。如果设置了一个位,x将只是一个整数,因此,只选择了一只动物。