C Academy · Oppitunti

Käytännön bittikikat

Yleiset tekniikat.

Oppitunti 4/413 vaihetta

Käytännön bittikikat on ilmainen C Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu C Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C Academy-kurssilla on yhteensä 4 oppituntia.

Hyödyllisiä bittikikkoja

Kun bittikohtaiset operaattorit ovat tuttuja, käyttöön tulee joukko tiiviitä kikkoja. Ne ovat nopeita ja niitä esiintyy usein oikeassa koodissa.

Käydään läpi yleisimmät niistä.

#include <stdio.h>

int main(void) {
    unsigned x = 6;
    printf("x & 1 = %u (odd if 1)\n", x & 1);
    return 0;
}

Parillisuus tai parittomuus

Alin bitti ilmaisee pariteetin. x & 1 on parittomilla luvuilla 1 ja parillisilla luvuilla 0.

#include <stdio.h>

int main(void) {
    for (unsigned x = 0; x < 5; x++) {
        printf("%u is %s\n", x, (x & 1) ? "odd" : "even");
    }
    return 0;
}

Kahden potenssin tarkistaminen

Positiivinen luku on kahden potenssi, jos siinä on asetettuna täsmälleen yksi bitti. Lauseke x & (x - 1) on 0 vain tässä tapauksessa.

#include <stdio.h>

int is_pow2(unsigned x) {
    return x != 0 && (x & (x - 1)) == 0;
}

int main(void) {
    printf("%d %d %d\n", is_pow2(16), is_pow2(18), is_pow2(1));
    return 0;
}

Alimman asetetun bitin nollaaminen

x & (x - 1) nollaa alimman asetetun bitin. Tämä muodostaa nopean asetettujen bittien laskennan perustan.

#include <stdio.h>

int main(void) {
    unsigned x = 0b10110;
    printf("before: %u\n", x);
    printf("after:  %u\n", x & (x - 1));
    return 0;
}

Alimman asetetun bitin eristäminen

x & (-x) eristää alimman asetetun bitin ja jättää päälle vain kyseisen yksittäisen bitin.

Tämä perustuu kahden komplementin esitykseen.

#include <stdio.h>

int main(void) {
    unsigned x = 0b10110;
    printf("lowest set bit = %u\n", x & (-x));
    return 0;
}

Asetettujen bittien laskeminen

Kun alin asetettu bitti nollataan toistuvasti, saadaan laskettua asetettujen bittien määrä. Vaiheita tarvitaan yhtä monta kuin asetettuja bittejä on.

#include <stdio.h>

int popcount(unsigned x) {
    int n = 0;
    while (x) { x &= (x - 1); n++; }
    return n;
}

int main(void) {
    printf("%d\n", popcount(255));
    printf("%d\n", popcount(0b1010));
    return 0;
}

Vaihtaminen ilman väliaikaista muuttujaa

XOR-vaihdolla kaksi kokonaislukua voidaan vaihtaa ilman ylimääräistä tallennustilaa.

#include <stdio.h>

int main(void) {
    int a = 3, b = 8;
    a ^= b; b ^= a; a ^= b;
    printf("a=%d b=%d\n", a, b);
    return 0;
}

Pyöristäminen ylöspäin kahden potenssiin

Voitte pyöristää etumerkittömän arvon ylöspäin seuraavaan kahden potenssiin levittämällä ylimmän bitin alaspäin ja lisäämällä sitten 1:n.

#include <stdio.h>

unsigned next_pow2(unsigned v) {
    v--;
    v |= v >> 1; v |= v >> 2; v |= v >> 4;
    v |= v >> 8; v |= v >> 16;
    return v + 1;
}

int main(void) {
    printf("%u\n", next_pow2(17));
    printf("%u\n", next_pow2(100));
    return 0;
}

Eriävien bittien tarkistaminen

Kahden arvon bitit eroavat täsmälleen niissä kohdissa, joissa a ^ b sisältää asetettuja bittejä. Niiden laskeminen antaa Hamming-etäisyyden.

#include <stdio.h>

int main(void) {
    unsigned a = 0b1101, b = 0b1011;
    unsigned diff = a ^ b;
    int count = 0;
    while (diff) { diff &= diff - 1; count++; }
    printf("hamming distance = %d\n", count);
    return 0;
}

Itseisarvo ilman haaraa

Etumerkkibitin avulla voitte laskea itseisarvon ilman if-lausetta. Maski sisältää pelkkiä ykkösiä negatiivisilla arvoilla ja pelkkiä nollia epänegatiivisilla arvoilla.

#include <stdio.h>

int main(void) {
    int x = -42;
    int mask = x >> 31;
    int abs = (x + mask) ^ mask;
    printf("abs = %d\n", abs);
    return 0;
}

Bitin asettaminen indeksin perusteella

Yhdistämällä siirron ja OR-operaation voitte asettaa ajon aikana lasketun mielivaltaisen bittipaikan.

#include <stdio.h>

int main(void) {
    unsigned v = 0;
    int positions[] = {1, 3, 5};
    for (int i = 0; i < 3; i++) {
        v |= (1u << positions[i]);
    }
    printf("v = %u\n", v);
    return 0;
}

Pikatarkistus

Testatkaa bittikikkoja koskevat tietonne.

Kertaus

Opitte käytännöllisiä bittikikkoja:

  • x & 1 testaa parillisuuden tai parittomuuden.
  • x & (x - 1) nollaa alimman asetetun bitin ja tunnistaa kahden potenssit.
  • x & (-x) eristää alimman asetetun bitin.
  • Popcount, XOR-vaihto, Hamming-etäisyys ja haaraton itseisarvo.
Aloita maksutta

Opi C tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
39
Oppitunnit
144

Usein kysytyt kysymykset

Onko oppitunti ”Käytännön bittikikat” ilmainen?

Kyllä – oppitunnin ”Käytännön bittikikat” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko C Academy-kurssin, päivitä CoddyKit PROhon. C Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Käytännön bittikikat”?

Yleiset tekniikat. Harjoittelet C Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Käytännön bittikikat”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C Academy-oppitunnilla?

Kyllä. Jokainen C Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Bittikohtaiset operaattorit
  2. Siirrot
  3. Bittimaskit ja liput
  4. Käytännön bittikikat
← Takaisin: C Academy