for (int i = 32; i <= 127; i++) {
}
我轉換爲數字int 32
成二進制數00100000
和成二進制01111111
數量int 127
。我需要從右邊第一個位置讀取(位編號 - 找到第一個(ffs)或找到第一個(ffo)),00100000→6
和01111111→1
位編號 - 找到第一套(FFS),或者找到第一個(FFO)的Java
謝謝!
for (int i = 32; i <= 127; i++) {
}
我轉換爲數字int 32
成二進制數00100000
和成二進制01111111
數量int 127
。我需要從右邊第一個位置讀取(位編號 - 找到第一個(ffs)或找到第一個(ffo)),00100000→6
和01111111→1
位編號 - 找到第一套(FFS),或者找到第一個(FFO)的Java
謝謝!
的API是你的朋友太:
static int position(int a){
int pos = Integer.numberOfTrailingZeros(a);
return pos == 32 ? -1 : pos;
}
找到這個號碼的簡單方法如下:
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;
要關閉該代碼轉換爲Java,你需要說'如果((V&....)!= 0)'而不僅僅是「if(v&....)」,因爲Java要求if條件是boolean而不是int。 –
@IanRoberts你是對的,我錯過了那部分。謝謝! – dasblinkenlight
這條線上的多個標記 \t - 令牌上的語法錯誤「)」,; \t預計 \t - 令牌 「(」 語法錯誤; \t預期 – user3235117
@ user3235117你可以做'詮釋POS = Integer.numberOfTrailingZeros(一)+1;返回POS == 33 -1:POS機;'?這只是一個趣味問題(位於第0位或不)。通常,慣例是說第一位在位置0. –
@ user3235117如果你只有一個字節而不是一個int我建議你有一個看看我在你問這個問題之前給出的答案http://stackoverflow.com/a/21351222/57695 –
@ZouZou你可以簡要解釋爲什麼'pos == 32?-1:pos'以及如何到達結果?我想了解。謝謝! – user3235117