Use operações de deslocamento bitwise em C

Jinku Hu 12 outubro 2023
  1. Use o operador << para deslocar o número para a esquerda em C
  2. Use o shift esquerdo para múltiplos inteiros de dois em C
  3. Deslocamento à direita - diferença de deslocamento aritmético vs lógico em C
Use operações de deslocamento bitwise 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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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