2014-01-25 35 views

回答

3

的API是你的朋友太:

static int position(int a){ 
    int pos = Integer.numberOfTrailingZeros(a); 
    return pos == 32 ? -1 : pos; 
} 
+0

@ user3235117你可以做'詮釋POS = Integer.numberOfTrailingZeros(一)+1;返回POS == 33 -1:POS機;'?這只是一個趣味問題(位於第0位或不)。通常,慣例是說第一位在位置0. –

+0

@ user3235117如果你只有一個字節而不是一個int我建議你有一個看看我在你問這個問題之前給出的答案http://stackoverflow.com/a/21351222/57695 –

+0

@ZouZou你可以簡要解釋爲什麼'pos == 32?-1:pos'以及如何到達結果?我想了解。謝謝! – user3235117

2

找到這個號碼的簡單方法如下:

int findLowestSetBit(int n) { 
    for (int i = 0 ; i != 32 ; i++) { 
     if ((n & (1 << i)) != 0) { 
      return i; 
     } 
    } 
    return -1; 
} 

然而,這並不是最快的一個,因爲它搜索一組位「線性」。你可以這樣做平行於下面的一段代碼copied from the bit hack page

int v;  // 32-bit word input to count zero bits on right 
int c = 32; // c will be the number of zero bits on the right 
v &= -v; 
if (v != 0) c--; 
if ((v & 0x0000FFFF) != 0) c -= 16; 
if ((v & 0x00FF00FF) != 0) c -= 8; 
if ((v & 0x0F0F0F0F) != 0) c -= 4; 
if ((v & 0x33333333) != 0) c -= 2; 
if ((v & 0x55555555) != 0) c -= 1; 
+0

要關閉該代碼轉換爲Java,你需要說'如果((V&....)!= 0)'而不僅僅是「if(v&....)」,因爲Java要求if條件是boolean而不是int。 –

+0

@IanRoberts你是對的,我錯過了那部分。謝謝! – dasblinkenlight

+0

這條線上的多個標記 \t - 令牌上的語法錯誤「)」,; \t預計 \t - 令牌 「(」 語法錯誤; \t預期 – user3235117