2012-09-03 135 views
1

我有一个像找到最低设置位

10000 
01000 
00100 

5个数字如果只有一个位是在我计算我没有问题。

但如果2位上然后我想只选择钻头上的第一例如

10010 

我想将其作为2代替数18

是否有任何位运算我可以用这样的手段吗?

+1

读取二进制数字的值从右向左递增,如十进制数字 - 10010是18,而不是9.要清楚,您要求*最低*设置位,是的? –

+0

对不起,错误的描述。而我最需要的就是它。我该怎么做? – user160820

+0

我已经调整了问题标题+示例以匹配我认为你的意思。 –

回答

4

由于您只想将其隔离,无法得到它的指数,很容易:

function firstSetBit(number) 
{ 
    return number & -number; 
} 

它的工作原理,因为如果你把一个数的二进制补码,首先你补充它,将所有零到最低设置位为1,最低设置位为0的权利,然后您添加一个,将右侧的位设置为零,最低设置位再次变为1,结束进位链。因此数字的否定具有相同的“右部分”,直到并包括最低的设定位,但最低设定位左边的所有数字都是输入的补码。因此,如果您将一个数字与其否定进行按位与运算,则最低位集合左侧的所有位都将被抵消。

+0

这非常非常聪明,但有更多的解释。 – nnythm

+1

@nnythm好的,这是否足够清楚? – harold

+0

不错的一个,值得在http://graphics.stanford.edu/~seander/bithacks.html找点! (我不认为这是在那里提到的?) –

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

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号码不自然整数。