我有5位数字,如
10000
01000
00100
如果在我的计算中只有一位打开,我没有问题。
但是如果2位打开,那么我只想选择第一个位,例如
10010
我想将其视为2而不是数字18
有没有可以在这种情况下使用的按位操作?
答案 0 :(得分:5)
由于你只想隔离它,而不是得到它的索引,所以很容易:
function firstSetBit(number)
{
return number & -number;
}
这是有效的,因为如果你取一个数字的二进制补码,首先补充它,将最低设置位右边的所有零设置为1,将最低设置位设置为零,然后添加一个,设置右边的位为零,最低的设置位再次变为1,结束进位链。因此,数字的否定具有相同的“正确部分”,直到并包括最低设置位,但是最低设置位左侧的所有内容都是输入的补码。因此,如果取一个数字的按位与其否定,则取消最低设置位左边的所有位。
答案 1 :(得分:0)
二元运算符通常会影响数字的所有位。因此,没有特殊功能只能获得第一个“1”。但你可以尝试这样一个功能:
function filterFirstFoundBit(number)
{
for (var i = 0; i < 32; i++) {
if ((1 << i) & number)
{
return 1 << i;
}
}
return number;
}
document.write(filterFirstFoundBit(9)); //10010
试试here
答案 2 :(得分:0)
function isolateLowestBit(input)
{
mask = 1;
while (mask <= input)
{
if (mask & input)
{
// found match - mask is set to the value of the lowest bit
return mask;
}
mask *= 2; // shift up mask by one bit
}
// no match
return 0;
}
请注意Javascript中的按位操作是一个坏主意,因为Javascript数字不是自然整数。
答案 3 :(得分:0)
返回log2(n&-n)+1;
这可能会对您有所帮助。