Operadores de Deslocamento de Bits no Arduino
Nesta lição vamos apresentar dois operadores que permitem realizar manipulação de bits em um valor numérico no Arduino, efetuando o deslocamento desses bits (multiplicando ou dividindo seus valores).
Podemos deslocar os bits de um valor numérico utilizando os operadores de deslocamento de bits << e >>.
Operador | Significado |
<< | Deslocamento de bits à esquerda |
>> | Deslocamento de bits à direita |
Imaginemos um valor numérico qualquer, como por exemplo o número 32. Expressando esse valor em binário teremos:
00100000
Se efetuarmos o deslocamento do bit de valor 1, que está na posição 5, uma casa binária para a direita, obteremos o valor:
00010000
O qual em decimal equivale a 16 – metade do valor original. Desta forma, deslocar um bit para a direita equivale a dividir seu valor por 2 a cada casa binária deslocada, enquanto o deslocamento de um bit à esquerda significa que seu valor será multiplicado por dois, a cada casa deslocada.
Desta forma, para um dado bit x:
x << 1 = x * 2
x << 2 = x * 4
x << 3 = x * 8
x >> 1 = x / 2
x >> 2 = x / 4
x >> 3 = x / 8
E assim por diante.
É interessante notar que o microcontrolador do Arduino consegue realizar o deslocamento de bits de forma mais eficiente do que realizar operações de multiplicação e divisão, e por isso é comum utilizá-los em casos em que essas operações são necessárias no código.
Exemplo
// Usando operadores de deslocamento de bits int x = 64; int valorFinal = 0; void setup() { Serial.begin(9600); } void loop() { Serial.print("Valor inicial de x: "); Serial.println(x); Serial.println(x, BIN); valorFinal = x << 1; Serial.print("Valor apos deslocar um bit a esquerda (multiplicar por 2): "); Serial.println(valorFinal); Serial.println(valorFinal, BIN);
Serial.print("Deslocando valor de x 3 casas a direita (div. / 8): "); valorFinal = x >> 3; Serial.println(valorFinal); Serial.println(valorFinal, BIN); delay(3000); }
Neste exemplo, declaramos uma variável x com valor atribuído igual a 64, e criamos também uma variável chamada de valorFinal, com valor inicial igual a zero.
Exibimos o valor de x em binário e em decimal no monitor serial, e então atribuímos seu valor à valorFinal, deslocando seus bits uma casa binária para a esquerda. Isso equivale a multiplicar por dois o valor de cada bit. Exibimos o conteúdo de valorFinal no monitor serial.
Então, realizamos a atribuição de valores de x para valorFinal novamente, porém dessa vez deslocando os bits do número 3 casas binárias para a direita. Isso equivale a dividir o número por 8 (23). Por fim, exibimos o valor da variável, tanto em decimal quanto em binário.