clase Java Entero tiene el método highestOneBit método estático que devolverá un valor con una sola de un bit, en la posición de la orden más alto de un bit en el valor especificado, o cero si el valor especificado es en sí misma igual a cero.
Por ejemplo entrada de int 17 devolverá 16; Como 17 se puede representar en binario como 10001 por lo que devolverá el bit más a la izquierda que es igual a 16.
Y en la clase de entero que tiene la siguiente aplicación Java en el doc.
public static int highestOneBit(int i) {
// HD, Figure 3-1
i |= (i >> 1);
i |= (i >> 2);
i |= (i >> 4);
i |= (i >> 8);
i |= (i >> 16);
return i - (i >>> 1);
}
Sólo quiero saber la lógica detrás de la implementación de esta manera y la lógica detrás del uso de las operaciones de cambio. ¿Puede alguien poner un poco de luz sobre ella.
Este algoritmo calcula para un determinado i
cuya representación binaria es:
0..01XXXXXXX...XXXX
el valor
0..011111111...1111
Eso es lo que los 5 |=
operadores hacen.
Luego, en la instrucción de retorno, se resta de ella que el valor desplazado a la derecha un bit
0..001111111...1111
para obtener el resultado
0..010000000...0000
Como funciona:
El más alto posible de 1 bit el bit de la 32 (a la izquierda la mayoría). Supongamos que el número de entrada tiene 1 en ese bit:
1XXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
Usted o ese valor con el valor desplazado a la derecha 1 (i >> 1)
y get
11XXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
A continuación, o que el nuevo valor con el valor desplazado a la derecha 2 (i >> 2)
y get
1111XXXX XXXXXXXX XXXXXXXX XXXXXXXX
A continuación, o que el nuevo valor con el valor desplazado a la derecha 4 (i >> 4)
y get
11111111 XXXXXXXX XXXXXXXX XXXXXXXX
A continuación, o que el nuevo valor con el valor desplazado a la derecha 8 (i >> 8)
y get
11111111 11111111 XXXXXXXX XXXXXXXX
Finalmente usted o que el nuevo valor con el valor desplazado a la derecha 16 (i >> 16)
y get
11111111 11111111 11111111 11111111
Si el bit más alto es menor que 1 el bit 32, siendo estas operaciones se convierten todos los bits a la derecha de la misma a 1 y quedarse con los restantes (bits más altos) 0.