如果我有一个基本的位掩码...
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)?
你可以指望那些与此代码(从适用于JavaScript的一个非负整数值设置的位数这个答案 ):
function countSetBits(i)
{
i = i - ((i >> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
}
它应该比分别检查每一位更有效率。 但是,如果符号位的设置它不工作i
。
编辑(所有功劳都尖尖的评论):
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网络系列是一个)。 它是作为收藏位实现的一些数据结构非常有用。 如果你已经有了为整数的字符串实施了一套,与对应的一组数据类型的元素位的位置,然后让基数涉及到对位进行计数。
编辑哇寻找到泰德·霍普的答案,我碰到这个偶然发现:
function p2(n) {
return n !== 0 && (n & (n - 1)) === 0;
}
这是一个从“招数”这真棒集合 。 像这样的问题的东西都是好的理由来学习数论:-)
如果你想看看如果只有一个位被设置,你可以利用对数 ,具体如下:
var singleAnimal = (Math.log(onTheFarm) / Math.log(2)) % 1 == 0;
Math.log(y) / Math.log(2)
发现的x
在2^x = y
和x % 1
告诉我们,如果x
是一个整数。 x
只会是一个整数,如果单个位被置位,因此,只选择了一个动物。