Nos últimos dias venho estudando a linguagem Go e me deparei com um assunto que achei muito interessante: os operadores bit a bit. Como eu ainda não os conhecia bem, resolvi compartilhar o que aprendi com vocês.
Além dos operadores de comparação já conhecidos &&
(E), ||
(OU), >
(Maior que), etc., Golang possui assim como em outras linguagens os operadores bitwise, que são representados pelo símbolos &
, |
, ^
, >>
, <<
e &^
. No entanto, Go possui um outro operador que se difere das outras linguagens de programação, o operador: &^
(AND NOT) que irei explicar o seu funcionamento e dos outros operadores bitwise logo abaixo:
Exemplos
Vou utilizar como base duas variáveis inteiras com suas respectivas representações binárias comentadas ao lado.
var a = 6 //0110
var b = 5 //0101
Operador & (AND)
bit a bit
Retorna 1 apenas se ambos os bits forem 1.
// a = 0110
// b = 0101
// a&b = 0100
fmt.Println("a&b: ", a&b) // 4
Operador | (OR)
bit a bit
Retorna 1 se alguns dos dois bits dos operandos forem 1
// a = 0110
// b = 0101
// a|b = 0111
fmt.Println("a|b: ", a|b) // 7
Operador ^ (XOR) - OU exclusivo
bit a bit
Retorna 1 se os dois forem diferentes
// a = 0110
// b = 0101
// a^b = 0011
fmt.Println("a^b: ", a^b) // 3
Operador &^ (AND NOT)
– limpeza de bit
Se o bit no segundo operando for 0: mantém o bit do primeiro operando como está.
Se o bit no segundo operando for 1: força o bit do resultado a ser 0 (independente do primeiro operando).
// a = 0110
// b = 0101
// a&^b = 0010
fmt.Println("a&^b: ", a&^b) // 10
Operador <<
– Deslocamento à esquerda (left shift)
Desloca os bits de a
para a esquerda, adicionando zeros à direita.
// a = 0110
// a = 0110 << 2
// a = 011000
// a = 0001 1000 -> representação binária final
fmt.Println("a<<2: ", a<<2) // 24
Operador >>
– deslocamento à direita (right shift)
Desloca os bits de a
para a direita, descartando os bits da direita.
// a = 0110
// a = 0110 >> 2
// a = 01
// a = 0001 -> representação binária final
fmt.Println("a>>2: ", a>>2) // 1
Conclusão
E aí, gostou?
Espero que essa explicação tenha sido útil de alguma forma. Caso tenha ficado com alguma dúvida ou tenha encontrado algum erro na minha explicação, fique à vontade para comentar ou me chamar — será um prazer trocar ideias!
Muito obrigado por ler!