Załóżmy, że mamy int x = 371
, czyli w formacie binarnym 101110011
. Chcę znaleźć indeks najbardziej zbuntowanego bitu (w tym przypadku 7) i indeksu najbardziej zbuntowanego bitu (w tym przypadku 2). Jaki jest najskuteczniejszy sposób na zrobienie tego?Jaki jest najskuteczniejszy sposób znalezienia indeksu lewego/prawego najbardziej niezmienionego bitu w Javie?
Oto co mam:
public class BitOperatons {
public static int setBit(int x, int i) {
int y = x | (1 << i);
return y;
}
public static boolean isBitSet(int x, int i) {
int y = setBit(0, i);
return y == (x & y);
}
public static int findLeftMostSetBit(int x) {
for (int i = 31; i >= 0; i--) {
if (isBitSet(x, i))
return i;
}
return -1;
}
public static int findRightMostUnsetBit(int x) {
for (int i = 0; i <= 31; i++) {
if (! isBitSet(x, i))
return i;
}
return -1;
}
public static int findLeftMostUnsetBit(int x) {
int k = findLeftMostSetBit(x);
for (int i = k; i >= 0; i--) {
if (! isBitSet(x, i))
return i;
}
return -1;
}
public static1+ void main(String[] args) {
int x =
(1 << 0) |
(1 << 1) |
(1 << 4) |
(1 << 5) |
(1 << 6) |
(1 << 8);
System.out.println(findLeftMostUnsetBit(x));
System.out.println(findRightMostUnsetBit(x));
}
}
Jeśli nie jestem zły, moja obecna realizacja wymaga czasu liniowego. Czy możemy zrobić lepiej?
Nie da się zrobić lepiej niż liniowo. – toto2
@toto, to nie jest prawda, nie zapomnij, spójrz na Rozkosz Hakerska 5-3 (na przykład) (wiodące zera, które jest częścią Integer.class) – bestsss
@bestsss, OK, jeśli masz na myśli instrukcje maszynowe sugerowane przez flolo. Jeśli znasz podliniowe algo, chciałbym to wiedzieć. – toto2