[Conceptos básicos] Bit y operación y resto

Con respecto al bit y la operación & y el resto
hoy, al estudiar el código fuente del hashmap, descubrí que al resolver la distribución de entrada en el código fuente, la mayoría de la gente pensó que se usaría index = hash% length, pero el código fuente usaba index = hash & (longitud -1).

/ **

  • La capacidad inicial predeterminada DEBE ser una potencia de dos.
    * /
    static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // también conocido como 16

Además, de lo anterior se puede observar que en la definición de la capacidad de la matriz de entrada en el código fuente, la capacidad debe ser 2 elevado a la potencia n (o 0), por lo que busqué el propósito.

El AND bit a bit original también se puede usar para tomar el resto, pero hay una condición: el divisor debe ser 2 elevado a n. Un ejemplo para ilustrar:

9% 8 = 1
1001 & (
1000-1 ) = 1001 & 0111
= 1 // 1001 es la representación binaria de 9 y 1000 es la representación binaria de 8.

De hecho, es obvio que en los cálculos binarios, es bien sabido que un número desplazado 1 bit a la derecha equivale al cociente de dividir por 2, y el bit que se elimina es el resto obtenido al dividir por 2. 2, por ejemplo:

9 >> 1
= 1001 >> 1
= 100 | 1
= 4 余 1

Además, no solo dividir por 2, sino dividir un número k por la enésima potencia de 2, lo que equivale a desplazar k hacia la derecha en n bits, y los n bits que se desplazan hacia afuera son exactamente lo que requerimos para ser el resto. .

Entonces el problema es simple. De hecho, para el divisor de 2 elevado a la enésima potencia, solo necesitamos obtener los n bits más bajos del dividendo, y solo para el número de 2 elevado a la enésima potencia, lo convertimos. binario, es el número cuyo n + 1 bit es 1, y los otros bits bajos son todos 0. Por lo tanto, le restamos 1 y obtenemos un número cuyo n + 1 bit es 0 y los otros bits son 1. Utilice La operación AND bit a bit entre este número y el dividendo k obtendrá el número binario bajo de n bits del dividendo, que es
el resultado de k% 2n.

Resumen:
Si un número m satisface: m = 2n

Entonces k% m = k & (m-1)

Supongo que te gusta

Origin blog.csdn.net/qq_33632004/article/details/106114743
Recomendado
Clasificación