Use operações de deslocamento bitwise em C
-
Use o operador
<<
para deslocar o número para a esquerda em C - Use o shift esquerdo para múltiplos inteiros de dois em C
- Deslocamento à direita - diferença de deslocamento aritmético vs lógico em C
Este artigo irá explicar vários métodos de como usar operações de deslocamento bit a bit em C.
Use o operador <<
para deslocar o número para a esquerda em C
As operações de deslocamento bit a bit são parte de todas as linguagens de programação e reposicionam cada bit de um operando inteiro pelo número especificado de casas. Para demonstrar melhor os efeitos dessas operações, incluímos a função denominada binary
nos exemplos a seguir que imprime a representação binária para o inteiro fornecido. Observe que esta função só foi implementada para funcionar com valores inteiros de 32 bits. O código de exemplo a seguir demonstra o deslocamento à esquerda em duas posições e exibe as representações de número de acordo.
#include <stdio.h>
#include <stdlib.h>
void binary(unsigned n) {
unsigned i;
for (i = 1 << 31; i > 0; i /= 2) (n & i) ? printf("1") : printf("0");
}
int main(int argc, char *argv[]) {
int n1 = 123;
binary(n1);
printf(" : %d\n", n1);
n1 <<= 2;
binary(n1);
printf(" : %d\n", n1);
exit(EXIT_SUCCESS);
}
Resultado:
00000000000000000000000001111011 : 123
00000000000000000000000111101100 : 492
Use o shift esquerdo para múltiplos inteiros de dois em C
Podemos utilizar a operação de deslocamento para a esquerda para implementar a multiplicação por dois, o que pode ser mais eficiente no hardware. Observe que ao deslocar para a esquerda, não há diferença entre a mudança aritmética e lógica. A única mudança de posição para um dado inteiro resulta na multiplicação; assim, podemos deslocar ainda mais para obter a multiplicação de acordo.
#include <stdio.h>
#include <stdlib.h>
void binary(unsigned n) {
unsigned i;
for (i = 1 << 31; i > 0; i /= 2) (n & i) ? printf("1") : printf("0");
}
int main(int argc, char *argv[]) {
int n1 = 123;
printf("%d\n", n1);
n1 <<= 1;
printf("%d x2\n", n1);
exit(EXIT_SUCCESS);
}
Resultado:
492
984 x2
Deslocamento à direita - diferença de deslocamento aritmético vs lógico em C
Deve ser mencionado que inteiros com sinal
e sem sinal
são representados de forma diferente por baixo do capô. Nomeadamente, os com sinal
são implementados como valores de complemento de dois. Como resultado, o bit mais significativo dos números negativos é 1
, denominado bit de sinal, enquanto os inteiros positivos começam com 0
como de costume. Assim, quando deslocamos os números negativos para a direita logicamente, perdemos seu sinal e obtemos o inteiro positivo. Portanto, precisamos diferenciar os deslocamentos lógicos e aritméticos, sendo que o último preserva o bit mais significativo. Embora haja diferença entre os conceitos, C não fornece operadores separados. Além disso, o padrão C não especifica o comportamento, pois é definido pela implementação de hardware. Conforme mostrado na saída de exemplo a seguir, a máquina subjacente conduziu a mudança aritmética e preservou o valor negativo do inteiro.
#include <stdio.h>
#include <stdlib.h>
void binary(unsigned n) {
unsigned i;
for (i = 1 << 31; i > 0; i /= 2) (n & i) ? printf("1") : printf("0");
}
int main(int argc, char *argv[]) {
int n2 = -24;
binary(n2);
printf(" : %d\n", n2);
n2 >>= 3;
binary(n2);
printf(" : %d\n", n2);
exit(EXIT_SUCCESS);
}
Resultado:
11111111111111111111111111101000 : -24
11111111111111111111111111111101 : -3
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook