Skiftningar
Vänster- och högerskiftning.
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) & 1extraherar en enskild bit.- Använd
unsignedför förutsägbara skiftningar och skifta aldrig med typens bredd eller mer.
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.