Może chcieli, aby pokazać jak napisać rodzajowe Set/Reset fragment bez gałęzi ...
Może to być osiągnięte z
value = (value & ~(1 << bit)) | (bitval << bit);
gdzie bit
jest pozycja nieco i bitval
wynosi 1 dla zestawu i 0 dla resetowania.
Coś jeszcze nieco bardziej ogólny jest następujący:
value = (value & ~(k1 << bit))^(k2 << bit);
który implementuje kilka operacji:
k1=0
i k2=0
robi nic
k1=0
i k2=1
przełącza bit
k1=1
i k2=0
Kasuje bit
k1=1
i k2=1
ustawia bit
Ogólniej z
value = (value & a)^x;
można podjąć decyzję o zmianie kilka bitów value
jednocześnie przez
aj=0
, xj=0
→ ustawienie ich na 0
aj=0
, xj=1
→ ustawiając je do 1
aj=1
, xj=0
→ pozostawiając je nietknięte
aj=1
, xj=1
→ skakaniu im
zależności od precomputed stałych a
i x
(aj
i xj
są wartością j-tego bitu w stałych).
Na przykład
value = (value & 0x0F)^0x3C;
z jednej operacji będzie
- leave untouched bit 0 and 1
- flip bits 2 and 3
- set to 1 bits 4 and 5
- set to 0 all other bits
Moja kontr-pytanie byłoby: Jak do cholery można ustawić lub zresetować trochę z rozgałęzienia? – Art
Przez "ustawić lub zresetować" mają na myśli przełączanie? Możesz to zrobić za pomocą xora. –
@Art ... Nie wiem nic o rozgałęzianiu ... Po prostu mogę zrobić trochę manipulacji i ustawić lub zresetować trochę ... Chcę wiedzieć, co się rozgałęzia? – someone