bit parzystosci w C

Oct 28, 2006 10 Replies

Witam.



Jak najpro¶ciej obliczyæ bit parzysto¶ci bajtu, a pó¼niej dokonaæ sprawdzenia w C? Pierwsze co przychodzi mi do g³owy to przesuwanie bajtu i sparwdzanie najm³odszego bitu.



Dziêkujê za pomoc Pozdrawiam Pawe³



Witam !

A mo¿e pomnó¿ logicznie twój bajt danych przez

00000001(binarnie)=1(dziesiênie) wtedy wszystkie starsze bity bêd± wyzerowane a na wynik wp³ynie tylko najm³odszy bit (parzysto¶ci). Np: dana: 10101101 AND 00000001 = 00000001 dana: 10101100 AND 00000001 = 00000000

Pozdrawiam

Nie chodzi³o mi o sprawdzenie czy liczba jest parzysta, a o wyznaczenie bitu parzystosci a to sa dwie ró¿na rzeczy. Bit parzysto¶ci jest 1 gdy liczba jedynek w bajcie jest nieparzysta i odwrotnie.

Pozdrawiam Pawe³

Faktycznie, przepraszam, co¶ mnie zaæmi³o :). Twoje rozwi±zanie wydaje siê nienajgorsze, na nic innego (prostrzego) nie mogê wpa¶æ.

Pozdrawiam Karol

Stablicowaæ wyniki obliczenia parzysto¶ci dla ka¿dej mo¿liwej warto¶ci bajtu i odczytaæ wynik z tablicy. Zajmie to 256 bajtów i bêdzie najszybsze. Mo¿na te¿ stablicowaæ wynik dla grup 4-bitowych, pobraæ z tablicy warto¶ci dla obu nibli i obliczyæ na nich xor

-- wolniejsze, ale wymaga tylko 16 bajtów tablicy. Wynik jest zawsze jednobitowy, wiêc kosztem jeszcze wolniejszego dzia³ania programu mo¿na skompresowaæ tablicê do, odpowiednio, 256 i 16 bitów.

T± metod± te¿ mo¿na, przy czym nie potrzeba niczego sprawdzaæ podczas obliczeñ. Je¶li procesor umo¿liwia wysuwanie najstarszego bitu do znacznika C, to parzysto¶æ mo¿na obliczyæ tak:

r1 = sprawdzana warto¶æ r2 = 0; shl r1 adc r2, 0 shl r1 adc r2, 0 shl r1 adc r2, 0 shl r1 adc r2, 0 shl r1 adc r2, 0 shl r1 adc r2, 0 shl r1 adc r2, 0 shl r1 adc r2, 0

Wynikiem w r2 bêdzie liczba zapalonych bitów w r1, wiêc informacje o parzysto¶ci r1 bêd± zawarte w jej najm³odszym bicie.

Pozdrawiam Piotr Wyderski

Thus wrote "Pawe?" snipped-for-privacy@poczta.onet.pl>:

Można prościej ;^)

Na przykład tak:

x=(x&0x0f)^(x>>4); x=(x&0x03)^(x>>2); x=(x&0x01)^(x>>1);

Albo to samo, tylko szybciej:

x^=x>>4; x^=x>>2; x^=x>>1; x&=1;

Lub inne wariacje na temat. Bo to czego potrzebujesz to wszystkie bity zexorowane ze sobą.

Paweł

W artykule <ei01b1$gja$ snipped-for-privacy@news.onet.pl> Paweł napisal(a):

Jak potrzebujesz szybciej to mozesz zrobic tablice wynikow i adresowac tym bajtem. W druga strone tak samo. KO

Hm. Móg³by¶ to trochê rozwin±æ? Jako¶ mi nie wychodzi. np. x = 11010011 Po zastosowaniu pierwszego równania x=(x&0x0f)^(x>>4); wychodzi x = (00000011)^(00001101)=00001110 Po zastosowaniu drugiego x=(x&0x03)^(x>>2); wychodzi x = (00000110)^(00000011)=00000101 Po zastosowaniu trzeciego x=(x&0x01)^(x>>1); wychodzi x = (00000001)^(00000010)=00000011

Co¶ nie tak policzy³em?

Dziêki za pomoc Pawe³

Paweł napisał(a):

^^^^^^^^^^^^^^^^^^^^ tutaj masz blad: powinno byc: ..10 ^ ..11 = ..01 a nastepnie: ..1 ^ ..0 = ..1 czyli sie zgadza (wstawilem kropki, bo pozostale bity sa 0). Pewnie to juz rozgryzles, ale (tak jak napisal Pawel Wiecek) trzeba zeXORowac wszystkie bity ze soba. Mozna to zrobic po kolei: czyli 1z2, nastepnie wynik tego z 3, nastepnie wynik tego z 4 itd... Albo szybciej, tak jak rozpisal Pawel: podzielic bajt na polowe i zXORowac, nastepnie otrzymany wynik 4bitowy podzielic po 2 bity i zXORowac i w koncu zXORowac 2bity ze soba. I mamy wynik

pozdrawiam chojny

A musisz "czysto" w C? Przeciez istnieje w rejestrze znaczników co¶ takiego jak bit parzysto¶ci, liczony "automatycznie" przez procesor dla ka¿dej operacji ALU - dlaczego tego nie u¿yæ ? wkwj

Hm, czy pawel podal jaki to procesor ? Bo wiele takiej operacji nie ma..

J.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required