C Academy · Lektion

Skift

Skift til venstre og højre

Lektion 2 af 413 trin

Skift er en gratis C Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i C Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C Academy-kurset indeholder 4 lektioner i alt.

Forskydning af bits

Skiftoperatorerne flytter alle bits i et heltal til venstre eller højre med et bestemt antal positioner.

Venstreskift er <<, og højreskift er >>.

#include <stdio.h>

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

Venstreskift ganger

Hvis du forskyder mod venstre med n positioner, ganger du en unsigned-værdi med 2 opløftet til n.

1 << 3 er 8, og 5 << 1 er 10.

#include <stdio.h>

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

Højreskift dividerer

Hvis du forskyder mod højre med n positioner, dividerer du en unsigned-værdi med 2 opløftet til n. De bits, der falder ud i højre side, kasseres.

20 >> 2 er 5.

#include <stdio.h>

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

Potenser af to

Venstreskift af 1 er den hurtigste måde at generere potenser af to på.

1 << n er den n-te potens af to.

#include <stdio.h>

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

Visualisering af et skift

Hvis du udskriver bittene før og efter, kan du se, hvordan mønsteret flytter sig.

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

Udtrækning af en bit

For at læse bit nummer i skal du forskyde værdien mod højre med i og maskere med 1.

Resultatet er 0 eller 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;
}

Opbygning af en værdi bit for bit

Du kan samle et tal ved at forskyde bits på plads og kombinere dem med 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;
}

Forsigtig ved højreskift af signed-værdier

Højreskift af et negativt signed heltal er implementeringsafhængigt: fortegnsbitten kan blive kopieret.

Brug helst unsigned-typer for at få forudsigelige bitoperationer.

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

Undgå for store skift

At skifte med et antal bit, der er større end eller lig med typens bredde, giver udefineret opførsel.

Det er ikke tilladt at skifte en værdi på 32 bit med 32 eller flere bit.

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

Kombination af skift og maske

Skift og maske bruges sammen til at udtrække et felt med flere bit. Her udtrækker vi de midterste 4 bit fra en byte.

#include <stdio.h>

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

Hurtig multiplikation og addition

Ved at kombinere skift kan du hurtigt gange med konstanter. At gange med 10 svarer til at skifte 3 bit (gange 8) plus at skifte 1 bit (gange 2).

#include <stdio.h>

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

Hurtig kontrol

Kontrollér din viden om skift.

Opsummering

Du har lært om skiftoperatorer:

  • << skifter til venstre og ganger med potenser af to.
  • >> skifter til højre og dividerer med potenser af to.
  • (v >> i) & 1 udtrækker en enkelt bit.
  • Brug unsigned for forudsigelige skift, og skift aldrig med typens bredde eller mere.
Gratis at komme i gang

Lær C med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
39
Lektioner
144

Ofte stillede spørgsmål

Er lektionen “Skift” gratis?

Ja — hele teksten til “Skift” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af C Academy-kurset, skal du opgradere til CoddyKit PRO. C Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Skift”?

Skift til venstre og højre Du øver dig i C Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C Academy?

Der kræves ingen tidligere erfaring. C Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Skift”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C Academy-lektion?

Ja. Alle C Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Bitvise operatorer
  2. Skift
  3. Bitmasker og flag
  4. Praktiske bittricks
← Tilbage til C Academy