Kā iestatīt, dzēst un pārslēgt bitu?
Lai iestatītu bitu, izmantojiet bitu OR operatoru (|
).
number |= 1UL << n;
Tas iestatīs n
to bitu skaitlim
. n
jābūt nullei, ja vēlaties iestatīt 1
pirmo bitu, un tā tālāk līdz n-1
, ja vēlaties iestatīt n
ceturto bitu.
Izmantojiet 1ULL
, ja number
ir platāks par unsigned long
; 1UL << n
veicināšana nenotiek līdz brīdim, kad tiek novērtēts 1UL << n
, kur tas ir nedefinēta uzvedība, lai pārvietotos par vairāk nekā long
platumu. Tas pats attiecas uz visiem pārējiem piemēriem.
Bitu dzēšanai izmantojiet bitu AND operatoru (&
).
number &= ~(1UL << n);
Tas dzēsīs n
to bitu no skaitļa
. Bitu virkne ir jāapvērš, izmantojot bitu NOT operatoru (`~``), un pēc tam AND.
Bitu pārslēgšanai var izmantot XOR operatoru (^
).
number ^= 1UL << n;
Tas pārslēgs n
to bitu skaitļa
.
Jūs to neprasījāt, bet es varētu to pievienot.
Lai pārbaudītu bitu, pārvietojiet skaitli n pa labi, pēc tam to bitu veidā AND:
bit = (number >> n) & 1U;
Tādējādi mainīgajā bit
tiks ievietota skaitļa
n
-tā bita vērtība.
n-tā bita maiņa uz x.
n
-tā bita iestatīšanu uz 1
vai 0
var panākt, izmantojot šādu implementāciju ar 2 papildinājumu C++:
number ^= (-x ^ number) & (1UL << n);
Bits n
tiks iestatīts, ja x
ir 1
, un izdzēsts, ja x
ir 0
. Ja x
ir kāda cita vērtība, tad tiek iegūts "garbage". x = !!x
izmainīs to uz 0 vai 1.
Lai padarītu to neatkarīgu no 2's komplementa nolieguma (kur -1
ir iestatīti visi biti, atšķirībā no 1's komplementa vai zīmes/lieluma C++ implementācijas), izmantojiet bezzīmju noliegumu.
number ^= (-(unsigned long)x ^ number) & (1UL << n);
vai
unsigned long newbit = !!x; // Also booleanize to force 0 or 1
number ^= (-newbit ^ number) & (1UL << n);
Pārnēsājamām manipulācijām ar bitiem parasti ir lietderīgi izmantot neparakstītus tipus.
vai
number = (number & ~(1UL << n)) | (x << n);
(number & ~(1UL <<<n))
dzēsīs n
to bitu un (x <<<n)
iestatīs n
to bitu uz x
.
Kopumā ir arī laba ideja nekopēt/ielīmēt kodu vispār, tāpēc daudzi cilvēki izmanto pirmapstrādes makrodatus (piemēram, kopienas wiki atbilde tālāk) vai kādu no iekapsulēšanas veidiem.
Dažreiz ir vērts izmantot enum
, lai nosauktu bitu:
enum ThingFlags = {
ThingMask = 0x0000,
ThingFlag0 = 1 << 0,
ThingFlag1 = 1 << 1,
ThingError = 1 << 8,
}
Pēc tam izmantot nosaukumus vēlāk. T.i., rakstiet
thingstate |= ThingFlag1;
thingstate &= ~ThingFlag0;
if (thing & ThingError) {...}
lai iestatītu, notīrītu un pārbaudītu. Šādā veidā jūs paslēpsiet burvju skaitļus no pārējā koda.
Izņemot šo, es atbalstu Jeremy's risinājumu.
Lietojiet bitu divdabja operatorus: &
|
Lai iestatītu pēdējo bitu 000b
:
foo = foo | 001b
Lai pārbaudītu pēdējo bitu foo
:
if ( foo & 001b ) ....
Izdzēst pēdējo bitu foo
:
foo = foo & 110b
Skaidrības labad es izmantoju XXXb
. Jūs, iespējams, strādāsiet ar HEX attēlojumu, atkarībā no datu struktūras, kurā pakosiet bitus.