Kaip nustatyti, išvalyti ir perjungti bitą?
Bitui nustatyti naudokite bitų OR operatorių (|
).
number |= 1UL << n;
Taip bus nustatytas n-asis
skaičiausbitas. Jei norite nustatyti
1-ąjį bitą,
nturėtų būti nulis, o jei norite nustatyti
n-ąjį bitą - iki
n-1`.
Naudokite 1ULL
, jei skaitmuo
yra platesnis už unsigned long
; 1UL << n
skatinimas vyksta tik įvertinus 1UL << n
, kai 1UL << n
yra neapibrėžtas elgesys, kai pasislenka daugiau nei long
plotis. Tas pats galioja ir visiems kitiems pavyzdžiams.
Bitui išvalyti naudokite bitų lygybės operatorių AND (&
).
number &= ~(1UL << n);
Taip bus išvalytas n
tasis skaičiaus
bitas. Bitų eilutę reikia invertuoti naudojant bitų NE operatorių (`~``), o tada - AND.
Bitui perjungti galima naudoti XOR operatorių (^
).
number ^= 1UL << n;
Taip perjungiamas n
tasis skaičiaus
bitas.
Jūs to neprašėte, bet aš galiu tai pridėti.
Norėdami patikrinti bitą, perkelkite skaičių n į dešinę, tada jį bitų tvarka IR:
bit = (number >> n) & 1U;
Į kintamąjį bit
bus įrašyta skaičiaus
n
-tojo bito vertė.
Nustatyti n
tąjį bitą į 1
arba 0
galima naudojant 2 papildinių C++ realizaciją:
number ^= (-x ^ number) & (1UL << n);
Bitas n
bus nustatytas, jei x
yra 1
, ir panaikintas, jei x
yra 0
. Jei x
turi kokią nors kitą reikšmę, gausite šiukšles. Jei x = !!x
, jis bus paverstas 0 arba 1.
Kad tai būtų nepriklausoma nuo 2 papildinio neigimo elgesio (kai -1
turi visus bitus, skirtingai nuo 1 papildinio arba ženklo ir dydžio C++ realizacijos), naudokite beženklį neigimą.
number ^= (-(unsigned long)x ^ number) & (1UL << n);
arba
unsigned long newbit = !!x; // Also booleanize to force 0 or 1
number ^= (-newbit ^ number) & (1UL << n);
Paprastai nešiojamoms bitų manipuliacijoms naudinga naudoti nepasižymėtus tipus.
arba
number = (number & ~(1UL << n)) | (x << n);
(number & ~(1UL << n))
išvalys n-ąjį bitą, o
(x << n)nustatys
n-ąjį bitą į x
.
Be to, apskritai yra gera idėja nekopijuoti ir neįklijuoti kodo, todėl daugelis žmonių naudoja preprocesoriaus makrokomandas (pavyzdžiui, bendruomenės vikipedijos atsakymas toliau) arba tam tikrą hermetizaciją.
Kartais verta naudoti enum
bitams *įvardyti:
enum ThingFlags = {
ThingMask = 0x0000,
ThingFlag0 = 1 << 0,
ThingFlag1 = 1 << 1,
ThingError = 1 << 8,
}
Vėliau naudokite pavadinimus. T. y. rašykite
thingstate |= ThingFlag1;
thingstate &= ~ThingFlag0;
if (thing & ThingError) {...}
nustatyti, išvalyti ir išbandyti. Taip paslėpsite stebuklinguosius skaičius nuo likusio kodo.
Išskyrus tai, aš pritariu Jeremy'io sprendimui.
Naudokite bitų lygybės operatorius: &
|
Paskutiniam bitui 000b
nustatyti:
foo = foo | 001b
Patikrinti paskutinį foo
bitą:
if ( foo & 001b ) ....
Išvalyti paskutinį foo
bitą:
foo = foo & 110b
Aiškumo dėlei naudojau XXXb
. Tikriausiai dirbsite su HEX atvaizdavimu, priklausomai nuo duomenų struktūros, į kurią pakuojate bitus.