Szybkie sprawdzenie parzystości bajtu

0

Witam, jak szybko sprawdzić parzystość jedynek w bajcie ?
na wyniku dać taką liczbę żeby wyszła liczba z parzystą liczbą jedynek (czyli mówiąc po ludzku "1" jeśli liczba jedynek jest nieparzysta, w przeciwnym wypadku wynik "0")

np liczba:

00101101 -> 4 jedynki czyli parzyście czyli wynik = "0"
00111101 -> 5 jedynek czyli nieparzyście czyli wynik = "1" (bo z tą jeszcze jedną jedynką będzie parzyście)

mój pierwszy pomysł:

((((((X (X >> 1)) (X >> 2)) (X >> 3)) (X >> 4)) (X >> 5)) (X >> 6)) ^ (X >> 7);

ale chyba mnie z deczka pogięło ... przeca to elementarny sposób sprawdzania poprawności danych więc na pewno istnieje jakaś szybka metoda ...

0

aha, oczywiście wynik w powyższym "pomyśle" jest w najmniejszym bicie, czyli jeszcze tam powinno być:

& 1

0

albo inne pytanie:
czy opłaca się robić tablicę 256 elementową typu bool jeśli naprawdę zależy mi na czasie obliczenia tej parzystości ?

0

ad1. i tak chodzi ci o najmlodszy bit wiec: (wszystko)&1
(((((((X (X >> 1)) (X >> 2)) (X >> 3)) (X >> 4)) (X >> 5)) (X >> 6)) ^ (X >> 7)) & 1

imo nie ma szybszego sposobu niz iteracja.
chyba ze moglbys to wykonac w asm jakos, byc moze wtedy nawet petelka bylaby szybsza:

mov cx,8
xor ax,ax
mov bl,byte ptr [zmienna]
@1:
  xor al,bl
  shr bl,1
loop @1;
and al,1
mov byte ptr [wynik],al

moze inaczej jeszcze szybciej sie da to wykonac.

1 użytkowników online, w tym zalogowanych: 0, gości: 1