C Academy · Lektion

Skiftningar

Vänster- och högerskiftning.

Lektion 2 av 413 steg

Skiftningar är en gratis lektion i C Academy på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för C Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C Academy innehåller totalt 4 lektioner.

Skifta bitar

Skiftoperatorerna flyttar alla bitar i ett heltal åt vänster eller höger ett angivet antal positioner.

Vänsterskift är << och högerskift är >>.

#include <stdio.h>

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

Vänsterskift multiplicerar

Att skifta åt vänster med n positioner multiplicerar ett osignerat värde med 2 upphöjt till n.

1 << 3 är 8 och 5 << 1 är 10.

#include <stdio.h>

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

Högerskift dividerar

Att skifta åt höger med n positioner dividerar ett osignerat värde med 2 upphöjt till n. Bitarna som faller av vid högerkanten tas bort.

20 >> 2 är 5.

#include <stdio.h>

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

Tvåpotenser

Att vänsterskifta 1 är det snabbaste sättet att skapa tvåpotenser.

1 << n är den n:te tvåpotensen.

#include <stdio.h>

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

Visualisera ett skift

Om Ni skriver ut bitarna före och efter ser Ni hur mönstret förskjuts.

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

Extrahera en bit

För att läsa bit nummer i skiftar Ni värdet åt höger med i positioner och maskar med 1.

Resultatet är 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;
}

Bygg ett värde bit för bit

Ni kan bygga ihop ett tal genom att skifta bitar till rätt position och kombinera 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;
}

Varning vid högerskift av signerade heltal

Högerskift av ett negativt signerat heltal är implementeringsdefinierat: teckenbiten kan kopieras.

Använd helst unsigned-typer för förutsägbara 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;
}

Undvik överförskjutning

Att skifta med ett antal som är större än eller lika med typens bredd är odefinierat beteende.

Det är inte tillåtet att skifta ett 32-bitarsvärde med 32 eller fler bitar.

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

Kombinera skiftning och maskning

Skiftning och maskning tillsammans extraherar ett fält med flera bitar. Här hämtar vi de mittersta 4 bitarna ur en byte.

#include <stdio.h>

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

Snabb multiplikation och addition

Genom att kombinera skiftningar kan ni snabbt multiplicera med konstanter. Att multiplicera med 10 motsvarar att skifta med 3 (gånger 8) och sedan med 1 (gånger 2).

#include <stdio.h>

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

Snabbtest

Testa era kunskaper om skiftningar.

Sammanfattning

Ni har lärt er om skiftoperatorer:

  • << skiftar åt vänster och multiplicerar med potenser av två.
  • >> skiftar åt höger och dividerar med potenser av två.
  • (v >> i) & 1 extraherar en enskild bit.
  • Använd unsigned för förutsägbara skiftningar och skifta aldrig med typens bredd eller mer.
Gratis att börja

Lär dig C med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
39
Lektioner
144

Vanliga frågor

Är lektionen ”Skiftningar” gratis?

Ja – hela texten till ”Skiftningar” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i C Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i C Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Skiftningar”?

Vänster- och högerskiftning. Ni övar på C Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig C Academy?

Du behöver inga förkunskaper. Utbildningen i C Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”Skiftningar”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här C Academy-lektionen?

Ja. Varje C Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Bitvisa operatorer
  2. Skiftningar
  3. Bitmasker och flaggor
  4. Praktiska bittrick
← Tillbaka till C Academy