Supongamos que tenemos int x = 371
, que está en formato binario 101110011
. Quiero encontrar el índice del bit no ajustado más a la izquierda (en este caso 7) y el índice del bit no ajustado a la derecha (en este caso 2). ¿Cuál es la forma más eficiente de hacerlo?¿Cuál es la forma más eficiente de encontrar el índice del bit unset izquierdo/derecho en Java?
Esto es lo que tengo:
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));
}
}
Si no estoy equivocado, mi implementación actual requiere tiempo lineal. ¿Podemos hacerlo mejor?
No se puede hacer mejor que lineal. – toto2
@toto, esto no es cierto, doh forgot, mira Hacker's Delight 5-3 (por ejemplo) (ceros a la izquierda, que es parte de Integer.class) – bestsss
@bestsss, OK si te refieres a las instrucciones de la máquina como lo sugiere flolo. Si conoces un algo sublineal, me gustaría saberlo. – toto2