Operações bit-a-bit (bitwise) em Python
Aprenda a utilizá-las em Python e alguns exemplos.
Todas as linguagens possuem operadores binários e como nós estamos mais acostumados com os números decimais e suas operações, costumamos ter dificuldade em entender como essas operações binárias funcionam.
Além disso, há sempre o risco de programadores iniciantes confundirem os operadores & e | com o AND e o OR, respectivamente. Tenha atenção a sintaxe para esses símbolos a depender da linguagem que está utilizando.
Como funcionam?
Basicamente esses operadores (<<, >>, &, |, ~, e ^) são utilizados para trabalharmos com números, mas consideram que os números são um conjunto de strings de zeros e uns. Exceto pelos números negativos, com um pouco de atenção conseguimos converter um número para uma string de zeros e uns sem grandes dificuldades:
- 0 = “0”
- 1 = “1”
- 2 = “10”
- 3 = “11”
- 4 = “100”
- 5 = “101”
- 1029 é “10000000101” == 2**10 + 2**2 + 2**0 == 1024 + 4 + 1
Os operadores:
x << y
Retorna x com os bits deslocados para a esquerda em y posições. Os novos bits do lado direito são preenchidos com zeros. É o mesmo que multiplicar o x por 2 elevado a y. Deslocar um único bit a esquerda é o equivalente a dobrar o seu valor. Por exemplo a string '10' representa 2 em decimal, deslocando para a esquerda, '100' representa 4 em decimal.
x >> y
Retorna x com os bits deslocados para a direita por y posições. É o mesmo que dividir o x por 2 elevado a y, ou seja, [x/(2ˆy)]. De forma oposta ao outro operador, ao deslocarmos um bit para a direita, o valor da string é dividido por 2.
x & y
Faz um and bit-a-bit. Cada bit de saída é 1 se o bit correspondente do x AND y também seja 1, caso contrário é 0. O operador (&
) aplica uma conjunção lógica (intersecção) nos bits correspondentes dos operadores. Só retorna um quando os dois pares são 1, vejam o exemplo abaixo:
x | y
Faz um OU bit-a-bit. Cada bit de saída é zero se o bit correspondente da operação x AND y for zero, caso contrário é 1. O operador (|
) é responsável por uma união entre os conjuntos de bits. Somente a combinação de dois zeros resultará em zero no output final. Vejam o exemplo visual:
~ x
Retorna o complemento de 1 de x, ou seja, soma-se 1 ao número e inverte-se o sinal. Esse é o funcionamento padrão em Python, pois todos os números possuem o sinal de positivo ou negativo implícito. Quando trabalhos com números sem o sinal, o complemento traria como resposta a inversão de cada um dos bits do número binário. Os 1s se tornariam 0s e os 0s se tornariam 1s.
x ^ y
Faz um OU Exclusivo bit-a-bit. Cada bit da saída é o mesmo do correspondente de x caso o bit em y seja 0 e o complemento do bit em x se o bit em y for 1. Ou seja, ocorre a avaliação de duas condições mutualmente exclusivas. Imagine que uma pessoa pode ser considerada adulto ou criança, mas não os dois ao mesmo tempo. Para o resultado ser 1, cada par deve conter valores opostos.
Alguns outros exemplos:
Nos acompanhe em @aprendadatascience para mais conteúdo de Python e Data Science.
Outras Referências em inglês: