Operadores Bitwise em Golang

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!

Leave a Reply