Olá Pessoal, tudo bom?
Continuando nossa descrição básica sobre os operadores no Java, hoje é dia de falar sobre o operador bit shift left. A décima segunda parte desse artigo se encontra aqui. Confira na continuação desse artigo sobre o operador bit shift left:
Operador Bit Shift Left
O operador bit shift left é definido pelo símbolo abaixo:
Operador | Descrição |
---|---|
<< | Operador Bit Shift Left para preenchimento de zeros a direita, quantos bits forem informados pelo operador 2 |
Normalmente o Bit 1 pertence a uma instância que representa o valor (flag) a ser modificado e o Bit 2 é a quantidade de casas binárias que o shift irá percorrer:
1 2 3 4 |
1 0 0 1 0 1 1 1 (Flag) << 1 (Bitmask) --------------- 0 0 1 0 1 1 1 0 (Resultado da operacao) |
Note que o bit 1 que estava mais a esquerda foi removido e em seu lugar foi inserido um zero no bit mais a direita. Todos os outros bits foram movidos 1 casa binária para a esquerda.
Abaixo temos uma classe de exemplo que trabalha com o operador bit shift left :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package br.com.mauda.operadores; public class OperadorBitShiftLeft { public static void main(String[] args) { int bitmask = 0x000F; //Em binario 0000 0000 0000 1111 int flag = 1; // =================== //Em binario 0000 0000 0001 1110 System.out.println("Valor Original do bitmask: " + bitmask); System.out.println("Valor Original do bitmask em binário: " + Integer.toBinaryString(bitmask)); Integer resultado = bitmask << flag; System.out.println("\nResultado da operacao bit shift left 1: " + resultado); System.out.println("Resultado da operacao bit shift left 1 em binario: " + Integer.toBinaryString(resultado)); bitmask = 0x000F; //Em binario 0000 0000 0000 1111 flag = 2; // =================== //Em binario 0000 0000 0011 1100 resultado = bitmask << flag; System.out.println("\nResultado da operacao bit shift left 2: " + resultado); System.out.println("Resultado da operacao bit shift left 2 em binario: " + Integer.toBinaryString(resultado)); } } |
O resultado da execução dessa classe será o seguinte:
1 2 3 4 5 6 7 8 |
Valor Original do bitmask: 15 Valor Original do bitmask em binário: 1111 Resultado da operacao bit shift left 1: 30 Resultado da operacao bit shift left 1 em binario: 11110 Resultado da operacao bit shift left 2: 60 Resultado da operacao bit shift left 2 em binario: 111100 |
É interessante notar ainda que os valores foram multiplicados por 2. O valor do bitmask original era 15, após o primeiro shift passou para 30 e após o shift 2 passou para 60. Mas isso não quer dizer que você poderá substituir o shift nas operações de multiplicação. Lembre-se que se for um valor negativo isso não dará resultados corretos, pois em um momento irá cortar o bit mais significativo, que justamente representa o valor negativo. Veja no exemplo abaixo com um numero negativo, percebendo que a partir do shift 4 já ocorrem “erros”:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
package br.com.mauda.operadores; public class OperadorBitShiftLeftNegativo { public static void main(String[] args) { int bitmask = 0xF000000F; int flag = 1; System.out.println("Valor Original do bitmask: " + bitmask); System.out.println("Valor Original do bitmask em binário: " + Integer.toBinaryString(bitmask)); Integer resultado = bitmask << flag; System.out.println("\nResultado da operacao bit shift left 1: " + resultado); System.out.println("Resultado da operacao bit shift left 1 em binario: " + Integer.toBinaryString(resultado)); flag = 2; resultado = bitmask << flag; System.out.println("\nResultado da operacao bit shift left 2: " + resultado); System.out.println("Resultado da operacao bit shift left 2 em binario: " + Integer.toBinaryString(resultado)); flag = 3; resultado = bitmask << flag; System.out.println("\nResultado da operacao bit shift left 3: " + resultado); System.out.println("Resultado da operacao bit shift left 3 em binario: " + Integer.toBinaryString(resultado)); flag = 4; resultado = bitmask << flag; System.out.println("\nResultado da operacao bit shift left 4: " + resultado); System.out.println("Resultado da operacao bit shift left 4 em binario: " + Integer.toBinaryString(resultado)); flag = 5; resultado = bitmask << flag; System.out.println("\nResultado da operacao bit shift left 5: " + resultado); System.out.println("Resultado da operacao bit shift left 5 em binario: " + Integer.toBinaryString(resultado)); } } |
O resultado da execução dessa classe será o seguinte:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Valor Original do bitmask: -268435441 Valor Original do bitmask em binário: 11110000000000000000000000001111 Resultado da operacao bit shift left 1: -536870882 Resultado da operacao bit shift left 1 em binario: 11100000000000000000000000011110 Resultado da operacao bit shift left 2: -1073741764 Resultado da operacao bit shift left 2 em binario: 11000000000000000000000000111100 Resultado da operacao bit shift left 3: -2147483528 Resultado da operacao bit shift left 3 em binario: 10000000000000000000000001111000 Resultado da operacao bit shift left 4: 240 Resultado da operacao bit shift left 4 em binario: 11110000 Resultado da operacao bit shift left 5: 480 Resultado da operacao bit shift left 5 em binario: 111100000 |
Precedência dos Operadores
Continuando a formular a tabela de precedência, agora segue o operador bit shift left, o qual está abaixo dos operadores aditivos, assim verifique a tabela abaixo:
Ordem | Tipo de Operador | Precedência |
---|---|---|
1 | Pós Fixo | expr++ expr– |
2 | Pré fixo e Unário | ++expr –expr +expr -expr ~ ! |
3 | Multiplicativo | * / % |
4 | Aditivo | + – |
5 | Shift | << |
6 | Relacional | > >= <= < instanceof |
7 | Igualdade | == != |
8 | Bitwise AND | & |
9 | Bitwise exclusive OR | ^ |
10 | Bitwise inclusive OR | | |
11 | AND Lógico | && |
12 | OR Lógico | || |
13 | Ternário | ? : |
14 | Atribuição | = += -= *= /= %= |
finnaly{
Duvidas ou sugestões? Deixe seu feedback! Isso ajuda a saber a sua opinião sobre os artigos e melhorá-los para o futuro! Isso é muito importante!
Até um próximo post!
Leave a Reply