C kezdőknek
Mozgás jobbra a hozzárendeléssel
expr1 >> = expr2
) megváltoztatja az operandus minden egyes bitjének értékét. Az 1-re beállított bit értéke 0-ra változik, és fordítva.
A műszakos üzemeltetők (<<,>>) a bal operandus bitjeit a jobb operandus által meghatározott pozíciók számával tolja át. „A kizárt kifelé” bit elveszett, kiürítette bitek (jobbról balra eltolási, jobbra eltolási balra) vannak kitöltve nullák. Azonban meg kell jegyezni, hogy a jobb Shift kicsit balra töltés nullák csak akkor garantált az előjel nélküli operandusok bejelentkezett egyes megvalósítások tölthetik a jel értéke (legbaloldalibb) bit.
A bit (AND) bit () az AND műveletet minden operandus bitjére alkalmazza. A bal operandus minden egyes bitjét összehasonlítjuk a jobb bittel ugyanabban a pozícióban. Ha mindkét bit 1, akkor a bit abban a pozícióban van rendelve az 1 értéket minden más esetben - 0 (bitenkénti AND () nem tévesztendő össze a logikai ÉS (), de sajnos, minden programozó legalább egyszer az életben is hasonló hibát ).
A bitenkénti EXCLUSIVE OR (^) összehasonlítja az operandusok bitjeit. Az eredmény megfelelő bitje 1, ha az operandusok eltérőek (az egyik a 0, a másik az 1). Ha mindkét operandus egyenlő, az eredmény 0.
Bitwise VAGY (|) logikai addíciós műveletet alkalmaz az operandusok minden egyes bitjére. A bit pozíciók az eredmény van hozzárendelve az értéke 1, ha legalább az egyik a megfelelő biteket az operandusok értéke 1, és 0, ha a bitek a mindkét operandus 0. (bitenkénti vagy nem kell összetéveszteni a logikai VAGY.)
Tekintsünk egy egyszerű példát. Legyünk 30 osztályból álló osztály. A tanár minden héten tesztet végez, amelynek eredménye elhalasztja / sikertelen. Az eredményeket bit-vektorként lehet ábrázolni. (Megjegyzendő, hogy a bitek vannak számozva nullától kezdve, az első bit valójában a második a sorban, de az egyszerűség kedvéért nem fogjuk használni a nulla bit, hogy a hallgató az 1. számú megfelel a bit száma 1. A végén, a tanár - nem szakértő. a programozás területén.)
Meg kell tudnunk változtatni az egyes bitek értékét, és ellenőrizni kell ezt az értéket. Tegyük fel, hogy egy diák átment a teszten. A 27 bitet 1-re kell állítani anélkül, hogy megváltoztatná a többi bit értékét. Ezt két lépésben lehet elvégezni. Először meg kell kezdeni egy számot, amely 1-et tartalmaz a 27. bitben és 0 a többiben. Ehhez a shift műveletet használjuk:
Alkalmazása a bitenkénti OR művelet változó quiz1 és mi állandó, megkapjuk a kívánt eredményt: az érték a 27. bit egyenlő lesz értéke 1, és a többi bit változatlan marad.
Most képzeljük el, hogy a tanár ellenőrizte a teszt eredményeit, és megtudta, hogy a diák nem telt el a teszten. Most a 27. bithez kell hozzárendelnie, anélkül, hogy megérintene volna a többiek. Először egy biten NEM-et alkalmazunk az előző konstansra, és kapunk egy olyan számot, amelyben a 27. kivételével minden bit 1:
Most összeadjuk (I) ezt az állandóságot kvízenként bitenként, és megkapjuk a kívánt eredményt: 0 a 27. bitben és a többi változatlan értékét.
Hogyan lehet ellenőrizni az azonos 27-bites értéket? A bit és az AND ad igaz, ha a 27. bit 1, és hamis, ha 0:
Ha ilyen módon használja a bitenkénti műveleteket, akkor nagyon könnyű hibát követni. Ezért leggyakrabban az ilyen műveletek előfeldolgozó makrókba vagy beépített funkciókba vannak beágyazva:
Íme egy példa a használatról:
Miután elkezdtük beolvasni egy függvény bitvektor műveleteit, a következő lépés egy osztály létrehozása. A szabványos C ++ könyvtár ilyen típusú bitset-t tartalmaz, annak használatát az alábbiakban ismertetjük.
4.12 gyakorlat
Két egész számot kapunk:
alá nem írt int ui1 = 3, ui2 = 7;
Mi a következő kifejezések eredménye?
(a) ui1 ui2 (c) uil | UI2
(b) ui1 ui2 (d) uil || UI2
4.13 gyakorlat
A példa bit_on () függvény létrehozásához bit_turn_on () függvény (kiteszi a bit 1), bit_turn_off () (visszaáll bit 0), flip_bit () (értékét megváltoztatja az ellentétes) és bit_off () (igaz értékkel tér vissza, ha a bit értéke 0 ). Írj egy olyan programot, amely a funkcióidat használja.
4.14 gyakorlat
Mi a funkciók hiánya az előző gyakorlatból az aláírás nélküli int típus használatával? Végrehajtásuk javítható egy typedef típusú definícióval vagy sablonfüggvény mechanizmussal. Írja be újra a bit_on () függvényt a typedef-lel, majd a sablonmotorral.