0Pricing
C Academy · Lezione

Shift

Shift a sinistra e a destra

Shift è una lezione C Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C Academy include 4 lezioni in totale.

Spostare i bit

Gli operatori di shift spostano tutti i bit di un intero verso sinistra o verso destra di un certo numero di posizioni.

Lo shift a sinistra è <<, mentre quello a destra è >>.

#include <stdio.h>

int main(void) {
    unsigned x = 1;
    printf("1 << 3 = %u\n", x << 3);
    return 0;
}

Lo shift a sinistra moltiplica

Spostare a sinistra di n posizioni moltiplica un valore senza segno per 2 elevato alla potenza n.

1 << 3 è 8 e 5 << 1 è 10.

#include <stdio.h>

int main(void) {
    printf("5 << 1 = %u\n", 5u << 1);
    printf("3 << 4 = %u\n", 3u << 4);
    return 0;
}

Lo shift a destra divide

Spostare a destra di n posizioni divide un valore senza segno per 2 elevato alla potenza n, scartando i bit che escono dall'estremità destra.

20 >> 2 è 5.

#include <stdio.h>

int main(void) {
    printf("20 >> 2 = %u\n", 20u >> 2);
    printf("7 >> 1 = %u\n", 7u >> 1);
    return 0;
}

Potenze di due

Spostare a sinistra 1 è il modo più rapido per generare potenze di due.

1 << n è la n-esima potenza di due.

#include <stdio.h>

int main(void) {
    for (int n = 0; n < 6; n++) {
        printf("2^%d = %u\n", n, 1u << n);
    }
    return 0;
}

Visualizzare uno shift

Stampare i bit prima e dopo lo spostamento mostra come cambia la posizione dello schema.

#include <stdio.h>

void print_bits(unsigned char v) {
    for (int i = 7; i >= 0; i--) putchar((v >> i) & 1 ? '1' : '0');
    putchar('\n');
}

int main(void) {
    unsigned char v = 0b00000110;
    print_bits(v);
    print_bits(v << 2);
    return 0;
}

Estrarre un bit

Per leggere il bit numero i, sposti il valore a destra di i posizioni e applichi una maschera con 1.

Il risultato è 0 o 1.

#include <stdio.h>

int main(void) {
    unsigned v = 0b10110;
    for (int i = 0; i < 5; i++) {
        printf("bit %d = %u\n", i, (v >> i) & 1);
    }
    return 0;
}

Costruire un valore bit per bit

È possibile assemblare un numero spostando i bit nella posizione corretta e combinandoli con OR.

#include <stdio.h>

int main(void) {
    unsigned v = 0;
    v |= (1u << 0);
    v |= (1u << 2);
    v |= (1u << 4);
    printf("v = %u\n", v);
    return 0;
}

Attenzione allo shift a destra degli interi con segno

Spostare a destra un intero negativo con segno dipende dall'implementazione: il bit del segno potrebbe essere copiato.

Per ottenere operazioni sui bit prevedibili, preferisca i tipi unsigned.

#include <stdio.h>

int main(void) {
    int s = -8;
    printf("-8 >> 1 = %d (implementation-defined)\n", s >> 1);
    unsigned u = 8;
    printf("8u >> 1 = %u\n", u >> 1);
    return 0;
}

Evitare gli shift eccessivi

Uno shift di un numero di posizioni maggiore o uguale alla larghezza del tipo produce comportamento indefinito.

Non è consentito effettuare lo shift di un valore a 32 bit di 32 posizioni o più.

#include <stdio.h>
#include <limits.h>

int main(void) {
    printf("unsigned has %zu bits\n", sizeof(unsigned) * CHAR_BIT);
    printf("Safe shift 1u << 31 = %u\n", 1u << 31);
    return 0;
}

Combinare shift e maschera

Insieme, shift e maschera consentono di estrarre un campo di più bit. Qui estraiamo i 4 bit centrali di un byte.

#include <stdio.h>

int main(void) {
    unsigned v = 0b11010110;
    unsigned field = (v >> 2) & 0b1111;
    printf("field = %u\n", field);
    return 0;
}

Moltiplicazioni e addizioni rapide

Combinare gli shift consente di moltiplicare rapidamente per costanti. Moltiplicare per 10 equivale a uno shift di 3 posizioni (per 8) più uno shift di 1 posizione (per 2).

#include <stdio.h>

int main(void) {
    unsigned x = 7;
    unsigned times10 = (x << 3) + (x << 1);
    printf("7 * 10 = %u\n", times10);
    return 0;
}

Verifica rapida

Verifichi la Sua conoscenza degli shift.

Riepilogo

Ha imparato a conoscere gli operatori di shift:

  • << sposta a sinistra e moltiplica per potenze di due.
  • >> sposta a destra e divide per potenze di due.
  • (v >> i) & 1 estrae un singolo bit.
  • Utilizzi unsigned per ottenere shift prevedibili e non effettui mai shift di una quantità pari o superiore alla larghezza del tipo.

Domande Frequenti

La lezione «Shift» è gratuita?

Sì — il testo completo di «Shift» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C Academy, passa a CoddyKit PRO. Il corso C Academy include 4 lezioni in totale.

Cosa imparerò in «Shift»?

Shift a sinistra e a destra Eserciti C Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C Academy?

Non è richiesta alcuna esperienza precedente. C Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Shift»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C Academy?

Sì. Ogni lezione C Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Operatori bit a bit
  2. Shift
  3. Maschere di bit e flag
  4. Trucchi pratici con i bit
← Torna a C Academy