Uso común de operaciones de bits

Todos los números del programa se almacenan en forma binaria en la memoria de la computadora. La operación de bits es operar directamente en los bits binarios del entero en la memoria, y su eficiencia será mayor que la eficiencia de la operación aritmética del lenguaje de programación.

Operaciones de bits comunes

Los operadores bit a bit comunes se muestran en la tabla, que incluyen principalmente & (y), | (o), ^ (OR exclusivo), << (desplazamiento a la izquierda) y >> (desplazamiento a la derecha).

& Operación

La operación & se llama operación Y. El resultado de la operación para la columna que es igual a 1 es 1 y el resto es 0.

25 y 15 

25 representación binaria es 11001, 15 representación binaria es 1111, bit a bit y operación, el resultado es 1 para posiciones que son iguales y el resto es 0, el resultado final es 01001 y 01001 decimal es 9.

    System.out.println(Integer.toBinaryString(25));
    System.out.println(Integer.toBinaryString(15));
	System.out.println(25&15);

Ejecute el código, puede obtener el resultado 9

Propósito, al usar la función & operación que es igual a 1 a 1, puede juzgar los números pares e impares, el último dígito de cualquier número impar es 1 y el número par es 0. Cualquier número num: num & 1 = 1, significa que el último dígito de num es 1, que es un número impar; si num & 0 = 0, significa que el último dígito de num es 0, que es un número par.

	System.out.println(25&1);
	System.out.println(24&0);

El resultado de la operación es 1 y 0

| Operación

| Operación, llamada operación OR, el resultado de la operación es 0 para el mismo valor de 0, y el resto es 1

25 | 15

25 se expresa en binario como 11001, 15 en binario se expresa como 1111, operación bit a bit, el resultado es 0 para posiciones que son iguales a 0, y el resto son todos 1. El resultado final es 11111, y 11111 es 31 en decimal.

	System.out.println(25|15);

El resultado de la ejecución es 31

^ Operación

La operación ^ se llama operación XOR. Si los valores de ayb no son iguales, el resultado XOR es 1. Si los dos valores de ayb son iguales, el resultado XOR es 0.

25 ^ 15

25 binarios se expresan como 11001, 15 binarios se expresan como 1111, bit ^ operación, tome 1 para diferentes bits y el resto son 0, el resultado final es 10110 y 10110 es 22 en decimal.

Código fuente jdk de la operación XOR, se usa cuando HashMap toma el valor hash

Mueva el valor hashCode a la derecha en 16 bits sin signo, y luego realice una operación XOR con el valor hashCode en sí para obtener un valor hash más preciso.

<< Operación

a << b significa que después de convertir a en binario, desplazarse hacia la izquierda en b bits (agregue b 0s al final), lo que equivale a multiplicar por 2 a la potencia de b

25 << 2, 25 se expresa en binario como 11001. Después de desplazarse hacia la izquierda dos veces, equivale a complementar dos ceros a la derecha del número binario, que es 1100100, que se convierte en 100

   System.out.println(25<<2);

Basado en la eficiencia de las operaciones de turno, hay muchos lugares donde las operaciones de turno se utilizan en el código Java.

La capacidad predeterminada 1 << 4 es la capacidad inicial de 16; la capacidad máxima de hashmap es 1 << 30.

    /**
     * The default initial capacity - MUST be a power of two.
     */
    static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

    /**
     * The maximum capacity, used if a higher value is implicitly specified
     * by either of the constructors with arguments.
     * MUST be a power of two <= 1<<30.
     */
    static final int MAXIMUM_CAPACITY = 1 << 30;

Cuando se expande hashMap, la operación de cambio se usa para duplicar la capacidad

>> Cálculo

a >> b significa que después de convertir a en binario, mueva b bits a la derecha (elimine los últimos b bits), lo que equivale a dividir por 2 a la potencia de b.

25 >> 2, la representación binaria de 25 es 11001, desplazada a la derecha en dos bits, lo que equivale a eliminar los dos últimos bits, el resultado es 110 y el número binario 110 se convierte al número decimal 6.

Shift right también se usa en el código fuente jdk, como la parte de expansión de ArrayList

Cuando ArrayList se expande, la nueva capacidad newCapacity = oldCapacity + (oldCapacity >> 1), oldCapacity >> 1 significa que la capacidad anterior se desplaza a la derecha en 1 bit, y la capacidad anterior se divide por 2, y newCapacity es 1,5 oldCapacity.

Supongo que te gusta

Origin blog.csdn.net/magi1201/article/details/115190873
Recomendado
Clasificación