[Básico] Bit e operação e restante

Com relação ao bit e operação & e o restante
hoje, ao estudar o código-fonte do hashmap, descobri que ao resolver a distribuição de entrada no código-fonte, a maioria das pessoas pensava que índice = hash% comprimento seria usado, mas o código-fonte usava índice = hash & (lenth -1).

/ **

  • A capacidade inicial padrão - DEVE ser uma potência de dois.
    * /
    static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

Além disso, pode-se notar do acima que na definição da capacidade da matriz de entrada no código-fonte, a capacidade deve ser 2 elevado a n potência (ou 0), então busquei o propósito.

O bit a bit original AND também pode ser usado para pegar o resto, mas há uma condição: o divisor deve ser 2 elevado à potência de n. Um exemplo para ilustrar:

9% 8 = 1
1001 & (
1000-1 ) = 1001 & 0111
= 1 // 1001 é a representação binária de 9 e 1000 é a representação binária de 8.

Na verdade, é óbvio que em cálculos binários, é bem conhecido que um número deslocado de 1 bit para a direita é equivalente ao quociente de divisão por 2, e o bit que acontece de ser removido é o resto obtido pela divisão por 2, por exemplo:

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

Além disso, não apenas dividindo por 2, mas dividindo um número k pela enésima potência de 2, que é equivalente a deslocar k para a direita em n bits, e os n bits que são deslocados são exatamente o que precisamos para ser o resto .

Então o problema é simples. Na verdade, para o divisor de 2 elevado à enésima potência, precisamos apenas obter os n bits baixos do dividendo, e apenas para o número de 2 elevado à enésima potência, nós o convertemos. binário, é o número cujo bit n + 1 é 1 e os outros bits baixos são todos 0. Portanto, subtraímos 1 dele e obtemos um número cujo bit n + 1 é 0 e os outros bits são 1. Uso A operação AND bit a bit entre este número e o dividendo k obterá o número binário baixo de n bits do dividendo, que é
o resultado de k% 2n.

Resumo:
Se um número m satisfaz: m = 2n

Então k% m = k & (m-1)

Acho que você gosta

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