Usa le operazioni di spostamento bitwise in C

Jinku Hu 12 ottobre 2023
  1. Usa l’operatore << per spostare il numero a sinistra in C
  2. Usa Maiusc sinistro su Più numeri interi per due in C
  3. Spostamento a destra - Differenza di spostamento aritmetica e logica in C
Usa le operazioni di spostamento bitwise in C

Questo articolo spiegherà diversi metodi su come utilizzare le operazioni di spostamento bit per bit in C.

Usa l’operatore << per spostare il numero a sinistra in C

Le operazioni di spostamento bit per bit fanno parte di ogni linguaggio di programmazione e riposizionano ogni bit di un operando intero del numero di posizioni specificato. Per dimostrare meglio gli effetti di queste operazioni, abbiamo incluso la funzione denominata binary nei seguenti esempi che stampa la rappresentazione binaria per il dato numero intero. Notare che questa funzione è implementata solo per funzionare con valori interi a 32 bit. Il codice di esempio seguente mostra lo spostamento a sinistra di due posizioni e visualizza le rappresentazioni numeriche di conseguenza.

#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);
}

Produzione:

00000000000000000000000001111011 : 123
00000000000000000000000111101100 : 492

Usa Maiusc sinistro su Più numeri interi per due in C

Possiamo utilizzare l’operazione di spostamento a sinistra per implementare la moltiplicazione per due, che può essere più efficiente sull’hardware. Si noti che quando si sposta a sinistra, non c’è differenza tra lo spostamento aritmetico e logico. Il singolo spostamento di posizione per il numero intero dato risulta in una moltiplicazione; quindi possiamo spostarci ulteriormente per ottenere la moltiplicazione di conseguenza.

#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);
}

Produzione:

492
984 x2

Spostamento a destra - Differenza di spostamento aritmetica e logica in C

Va detto che gli interi con segno e senza segno sono rappresentati in modo diverso sotto il cappuccio. Vale a dire, quelli firmati sono implementati come valori di complemento a due. Di conseguenza, il bit più significativo di numeri negativi è 1 chiamato bit di segno, mentre i numeri interi positivi iniziano con 0 come al solito. Pertanto, quando spostiamo logicamente i numeri negativi a destra, perdiamo il loro segno e otteniamo il numero intero positivo. Quindi, dobbiamo differenziare gli spostamenti logici e aritmetici, l’ultimo dei quali preserva il bit più significativo. Anche se c’è differenza tra i concetti, C non fornisce operatori separati. Inoltre, lo standard C non specifica il comportamento, poiché è definito dall’implementazione hardware. Come mostrato nell’output di esempio seguente, la macchina sottostante ha eseguito lo spostamento aritmetico e ha conservato il valore negativo dell’intero.

#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);
}

Produzione:

11111111111111111111111111101000 : -24
11111111111111111111111111111101 : -3
Autore: 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