2012-09-03 89 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號碼不自然整數。