- Регистрация
- 1 Мар 2015
- Сообщения
- 1,481
- Баллы
- 155
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!
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!