Uso comum de operações de bits

Todos os números do programa são armazenados em forma binária na memória do computador. A operação de bit é operar diretamente nos bits binários do inteiro na memória, e sua eficiência será maior do que a eficiência da operação aritmética da linguagem de programação.

Operações de bit comuns

Os operadores bit a bit comuns são mostrados na tabela, incluindo principalmente & (e), | (ou), ^ (OU exclusivo), << (deslocamento para a esquerda) e >> (deslocamento para a direita).

& Operação

A operação & é chamada de operação E. O resultado da operação para a coluna igual a 1 é 1 e o resto é 0.

25 e 15 

25 a representação binária é 11001, 15 a representação binária é 1111, bit a bit e operação, o resultado é 1 para posições que são iguais e o resto é 0, o resultado final é 01001 e 01001 decimal é 9.

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

Execute o código, você pode obter o resultado 9

Objetivo, usando o recurso de & operação igual a 1 para 1, você pode julgar os números ímpares e pares, o último dígito de qualquer número ímpar é 1 e o número par é 0. Qualquer número num: num & 1 = 1, significa que o último dígito de num é 1, que é um número ímpar; se num & 0 = 0, significa que o último dígito de num é 0, que é um número par.

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

O resultado da operação é 1 e 0

| Operação

| Operação, chamada operação OR, o resultado da operação é 0 para o mesmo valor de 0 e o resto é 1

25 | 15

25 é expresso em binário como 11001, 15 em binário é expresso como 1111, operação bit a bit, o resultado é 0 para as posições que são iguais a 0 e o resto é 1. O resultado final é 11111 e 11111 é 31 decimal.

	System.out.println(25|15);

O resultado da execução é 31

^ Operação

A operação ^ é chamada de operação XOR. Se os valores de aeb não forem iguais, o resultado de XOR será 1. Se os dois valores de aeb forem iguais, o resultado XOR será 0.

25 ^ 15

25 binários são expressos como 11001, 15 binários são expressos como 1111, operação de bit ^, pegue 1 para bits diferentes e o resto é 0, o resultado final é 10110 e 10110 é 22 em decimal.

Código-fonte da operação XOR jdk, é usado quando o HashMap recebe o valor hash

Desloque o valor hashCode para a direita em 16 bits sem sinal e, em seguida, faça uma operação XOR com o próprio valor hashCode para obter um valor hash mais preciso.

<< Operação

a << b significa que depois de converter a em binário, muda para a esquerda em b bits (adicione b 0s no final), o que é equivalente a multiplicar por 2 à potência de b

25 << 2, 25 é expresso em binário como 11001. Depois de deslocar para a esquerda duas vezes, é equivalente a complementar dois 0s à direita do número binário, que é 1100100, que é convertido em 100

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

Com base na eficiência das operações de deslocamento, há muitos lugares onde as operações de deslocamento são usadas no código Java. Código-fonte do HashMap

A capacidade padrão 1 << 4 é a capacidade inicial de 16; a capacidade máxima do hashmap é 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;

Quando o hashMap é expandido, a operação de deslocamento é usada para dobrar a capacidade

>> Cálculo

a >> b significa que depois de converter a em binário, desloque b bits para a direita (remova os últimos b bits), o que equivale a dividir por 2 à potência de b.

25 >> 2, a representação binária de 25 é 11001, deslocada para a direita em dois bits, o que equivale a remover os dois últimos bits, o resultado é 110 e o número binário 110 é convertido no número decimal 6.

Shift right também é usado no código-fonte jdk, como a parte de expansão de ArrayList

Quando ArrayList se expande, a nova capacidade newCapacity = oldCapacity + (oldCapacity >> 1), oldCapacity >> 1 significa que a capacidade antiga é deslocada para a direita em 1 bit e a capacidade antiga é dividida por 2 e newCapacity é 1.5 oldCapacity.

Acho que você gosta

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