la lógica detrás de la comprensión Integer.highestOneBit () implementación del método

Moshiour:

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.

Eran :

Este algoritmo calcula para un determinado icuya 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.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=199082&siteId=1
Recomendado
Clasificación