Jak poprawnie rozbić bajt na bity w komunikacji szeregowej z użyciem Keil?

keil raz jeszcze...





Poprzedni Następny
Wiadomość
Spis treści
From: "news.onet.pl" <combosoft_at_nospam_poczta.onet.pl>
Subject: keil raz jeszcze...
Date: Sat, 13 Sep 2003 10:29:27 +0200


witam ponownie...
Znowu zatrzymalem sie na jakiejs drobnostce. Chcialem zrobic komunikacje
szeregowa miedzy procesorami. W zmiennej typu char znak
mam przechowany bajt danych, ktory chce wyslac szeregowo. Wszystko jest ok,
tylko nie potrafie "rozebrac" bajtu na bity...
Chce to zrobic iloczynem logicznym, mam ksiazke do ansi c i tam jest
napisane ze wynikiem operacji bajt & bajt = true/false, tak tez napisalem
kawalek kodu (do zobaczenia nizej), podczas uruchomienia debuger'a wyszlo na
to ze jezeli w znak mam np. 64 (dziesietnie) i wykonam operacje znak & 64 to
w wyniku otrzymam 64 (0x0040). I jak to interpretowac? dlazcego wynikiem nie
jest 1?
Jak poprawnie to napisac?

PS. Zmodyfikowalem program jeszcze tak: if (znak & 64 == 64){ ... ale
rowniez nie dziala to prawidlowo. i w wyniku dzialania programu sa same zera
nn1=0, nn2=0, nn3=0.

pozdrawiam,
Bartek.

//przyklad programu fragment
unsigned char znak;
znak = 0x0040;

if( znak & 128 == 1 ){
data_out = 1;
puts("nn1 = 1");
}
else
{
data_out = 0;
puts("nn1 = 0");
}

data_clk = 0;
while(data_in == 1)
{}
data_clk = 1;
//2

if( znak & 64 == 1){
data_out = 1;
puts("nn2 = 1");
}
else
{
data_out = 0;
puts("nn2 = 0");
}

data_clk = 0;
while(data_in == 1)
{}
data_clk = 1;

//3
if(znak & 32 == 1){
data_out = 1;
puts("nn3 = 1");
}
else
{
data_out = 0;
puts("nn3 = 0");
}




========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.gazeta.pl!topaz.icpnet.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Neo" <matrix_at_nospam_terramail.pl>
Subject: Re: keil raz jeszcze...
Date: Sat, 13 Sep 2003 10:42:02 +0200


przesunięcie bitowe i sprawdzaj tylko jaka wartosc jest na pierwszej pozycji
czyli znak & 1

"news.onet.pl" <combosoft_at_nospam_poczta.onet.pl> wrote in message
news:bjukh9$q23$1_at_nospam_news.onet.pl...
witam ponownie...
Znowu zatrzymalem sie na jakiejs drobnostce. Chcialem zrobic komunikacje
szeregowa miedzy procesorami. W zmiennej typu char znak
mam przechowany bajt danych, ktory chce wyslac szeregowo. Wszystko jest
ok,
tylko nie potrafie "rozebrac" bajtu na bity...
Chce to zrobic iloczynem logicznym, mam ksiazke do ansi c i tam jest
napisane ze wynikiem operacji bajt & bajt = true/false, tak tez napisalem
kawalek kodu (do zobaczenia nizej), podczas uruchomienia debuger'a wyszlo
na
to ze jezeli w znak mam np. 64 (dziesietnie) i wykonam operacje znak & 64
to
w wyniku otrzymam 64 (0x0040). I jak to interpretowac? dlazcego wynikiem
nie
jest 1?
Jak poprawnie to napisac?

PS. Zmodyfikowalem program jeszcze tak: if (znak & 64 == 64){ ... ale
rowniez nie dziala to prawidlowo. i w wyniku dzialania programu sa same
zera
nn1=0, nn2=0, nn3=0.

pozdrawiam,
Bartek.

//przyklad programu fragment
unsigned char znak;
znak = 0x0040;

if( znak & 128 == 1 ){
data_out = 1;
puts("nn1 = 1");
}
else
{
data_out = 0;
puts("nn1 = 0");
}

data_clk = 0;
while(data_in == 1)
{}
data_clk = 1;
//2

if( znak & 64 == 1){
data_out = 1;
puts("nn2 = 1");
}
else
{
data_out = 0;
puts("nn2 = 0");
}

data_clk = 0;
while(data_in == 1)
{}
data_clk = 1;

//3
if(znak & 32 == 1){
data_out = 1;
puts("nn3 = 1");
}
else
{
data_out = 0;
puts("nn3 = 0");
}






========
Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Bartosz Waleska" <combosoft_at_nospam_poczta.onet.pl>
Subject: Re: keil raz jeszcze...
Date: Sat, 13 Sep 2003 10:48:52 +0200



Użytkownik "Neo" <matrix_at_nospam_terramail.pl> napisał w wiadomości
news:bjul8q$3vl$1_at_nospam_topaz.icpnet.pl...
przesunięcie bitowe i sprawdzaj tylko jaka wartosc jest na pierwszej
pozycji
czyli znak & 1

czyli cos takiego:
(zanczynam od MSB)

unsigned char znak;
unsigned char wynik;

znak = 0x040;
wynik = znak >> 7;
if (wynik & 1 == 1){
puts("nn1 = 1")
}
else
{
puts("nn1 = 0")
}

wynik = znak >> 6;
if (wynik & 1 == 1){
...


</ciach>



========
Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Bartosz Waleska" <combosoft_at_nospam_poczta.onet.pl>
Subject: Re: keil raz jeszcze...
Date: Sat, 13 Sep 2003 10:50:40 +0200


</ciach>
juz wyjasnil p. Adam Dybkowski. dzieki.



========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.gazeta.pl!news.astercity.net!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: Adam Dybkowski <adybkows_at_nospam_amwaw.edu.pl>
Subject: Re: keil raz jeszcze...
Date: Sat, 13 Sep 2003 10:46:04 +0200


news.onet.pl wrote:

Znowu zatrzymalem sie na jakiejs drobnostce. Chcialem zrobic komunikacje
szeregowa miedzy procesorami. W zmiennej typu char znak
mam przechowany bajt danych, ktory chce wyslac szeregowo. Wszystko jest ok,
tylko nie potrafie "rozebrac" bajtu na bity...
Chce to zrobic iloczynem logicznym, mam ksiazke do ansi c i tam jest
napisane ze wynikiem operacji bajt & bajt = true/false, tak tez napisalem
kawalek kodu (do zobaczenia nizej), podczas uruchomienia debuger'a wyszlo na
to ze jezeli w znak mam np. 64 (dziesietnie) i wykonam operacje znak & 64 to
w wyniku otrzymam 64 (0x0040). I jak to interpretowac?

Normalnie - napisanie "&" to jest zwykla operacja logicznego iloczynu i
poprawnym wynikiem 64 & 64 jest oczywiscie 64. Jezeli chcesz cos
sprawdzic przy pomocy instrukcji if (albo dowolnej innej sprawdzajacej
warunek, np. na koncu petli while) - to wystarczy rozroznienie wartosci
zerowej (FALSE) i niezerowej (TRUE). Krotki przyklad:

char znak = 64;

if (znak & 64) {
// to jest true
} else {
// to jest false
}

Jezeli chcesz sprawdzic, czy bit n jest zapalony, wygodniej napisac:
if (znak & (1<<n))
a jezeli sprawdzasz, czy jest zgaszony:
if (!(znak & (1<<n)))
i juz.

Podobnie gdy w zmiennej znak chcesz zapalic bit n:
znak |= (1<<n);
lub go zgasic:
znak &= ~(1<<n);

To co napisalem powyzej dotyczy kazdego kompilatora C na dowolna
platforme, nie tylko Keila.

--

Adam Dybkowski
adybkows_at_nospam_amwaw.edu.pl
http://www.amwaw.edu.pl/~adybkows


========
Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Bartosz Waleska" <combosoft_at_nospam_poczta.onet.pl>
Subject: Re: keil raz jeszcze...
Date: Sat, 13 Sep 2003 10:52:43 +0200


</ciach>


Jezeli chcesz sprawdzic, czy bit n jest zapalony, wygodniej napisac:
if (znak & (1<<n))
a jezeli sprawdzasz, czy jest zgaszony:
if (!(znak & (1<<n)))
i juz.


</ciach>
Dzieki! W sumie banalne... ale na to bym nie wpadl...

pozdrawiam,
Bartek.



========
Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Piotr Wyderski" <piotr.wyderskiREMOVE_at_nospam_hoga.pl>
Subject: Re: keil raz jeszcze...
Date: Sat, 13 Sep 2003 11:34:39 +0200



Adam Dybkowski wrote:

Podobnie gdy w zmiennej znak chcesz zapalic bit n:
znak |= (1<<n);
lub go zgasic:
znak &= ~(1<<n);

W praktyce programujac w C znacznie lepiej jest pozamykac
te operacje w makrach, bo w dluzszym kodzie latwo o pomylke,
np. zapomni sie napisania tyldy. A w przypadku np. BSET(x,n),
BCLR(x,n) i BTST(x,n) taka mozliwosc nie zachodzi.

Pozdrawiam
Piotr Wyderski




========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.gazeta.pl!news.astercity.net!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: Adam Dybkowski <adybkows_at_nospam_amwaw.edu.pl>
Subject: Re: keil raz jeszcze...
Date: Mon, 15 Sep 2003 01:25:28 +0200


Piotr Wyderski wrote:

W praktyce programujac w C znacznie lepiej jest pozamykac
te operacje w makrach, bo w dluzszym kodzie latwo o pomylke,
np. zapomni sie napisania tyldy. A w przypadku np. BSET(x,n),
BCLR(x,n) i BTST(x,n) taka mozliwosc nie zachodzi.

Oczywiście, zgadzam się w całej rozciągłości.

BTW: Ostatnio spotkałem się z ciekawym błędem (którego kompilator C,
mając pełną rację, nie zauważył), powodującym niezłe zamieszanie. Kumpel
napisał:

a=+5;

zamiast

a+=5;

Patrząc na kod, ciężko to zauważyć, a wynik jest do przewidzenia. Z
drugiej strony to ciekawe, że można sobie napisać tak po prostu stałą +5
i już.
Im mniejszy błąd tym dłużej się go tropi. :-)

--

Adam Dybkowski
adybkows_at_nospam_amwaw.edu.pl
http://www.amwaw.edu.pl/~adybkows


========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: Wojt <rwxrwx_at_nospam_USUNTO.poczta.onet.pl>
Subject: Re: keil raz jeszcze...
Date: Mon, 15 Sep 2003 18:54:25 +0200


Adam Dybkowski wrote:

BTW: Ostatnio spotkałem się z ciekawym błędem (którego kompilator C,
mając pełną rację, nie zauważył), powodującym niezłe zamieszanie. Kumpel
napisał:
a=+5;
zamiast
a+=5;

Podobne ale równie wnerwiające :) :
port=!port; // zmiana stanu portu
port!=port; // skompiluje się ale...

W.


========
Path: news-archive.icm.edu.pl!news.rmf.pl!news.ipartners.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Jad" <jdolin_at_nospam_optimus.waw.pl>
Subject: Re: keil raz jeszcze...
Date: Mon, 15 Sep 2003 18:55:21 +0200


Użytkownik "Adam Dybkowski" <adybkows_at_nospam_amwaw.edu.pl> napisał w wiadomości
news:bk2t6t$2t67$1_at_nospam_foka1.acn.pl...
Piotr Wyderski wrote:

a=+5;

zamiast

a+=5;

Patrząc na kod, ciężko to zauważyć, a wynik jest do przewidzenia. Z
drugiej strony to ciekawe, że można sobie napisać tak po prostu stałą +5
i już.
Im mniejszy błąd tym dłużej się go tropi. :-)

Mozna tez napisac ot tak sobie:

a;

i tez bledu nie bedzie:-))
pzdr
JD



========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!news2.icm.edu.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Piotr Wyderski" <piotr.wyderskiREMOVE_at_nospam_hoga.pl>
Subject: Re: keil raz jeszcze...
Date: Sat, 13 Sep 2003 12:10:29 +0200



news.onet.pl wrote:

Chce to zrobic iloczynem logicznym, mam ksiazke do ansi
c i tam jest napisane ze wynikiem operacji bajt & bajt = true/false

Albo ksiazka klamie, albo Ty zaniedbales kontekst. :-) x & y to jest
operacja na wektorze bitowym (w szczegolnosci na znaku) i jej
wynikiem jest rowniez wektor bitowy, stad trudno przypuszczac, by
mogl sie on rownac true albo false. Wartosc booleowska zwraca
operator &&, ale to tez _nie jest_ to, o co Ci chodzi.

podczas uruchomienia debuger'a wyszlo na to ze jezeli w znak mam
np. 64 (dziesietnie) i wykonam operacje znak & 64 to w wyniku
otrzymam 64 (0x0040). I jak to interpretowac?

Jako brak bledu w ALU procesorka. ;-)

Jak poprawnie to napisac?

if (znak & 0x40) {

data_out = 1;
puts("nn1 = 1");

} else {

data_out = 0;
puts("nn1 = 0");
}

PS. Zmodyfikowalem program jeszcze tak: if (znak & 64 == 64){ ... ale
rowniez nie dziala to prawidlowo.

Dziala zupelnie prawidlowo, tylko nie w sposob, ktorego oczekujesz. ;-)
Popatrz sobie na gramatyke C: multiplicative_operator jest umieszczony
ponad equality_operator, wiec kompilator rozbierze ten napis jako
"znak & (64==64)" zamiast "(znak & 64) == 64". 64==64 jest prawda,
wiec C przeksztalci to na 1, co w efekcie da "znak & 1". Tak, w tym
miejscu mozesz podziekowac panom K&R za wprowadzenie automatycznych
konwersji typow, promocji i dziwnego priorytetu operatororow -- oto efekty.
Uprzedzam, ze to nie ostatnia bzdura, ktora zaskoczy Cie C. BTW, tej czesci
") == 64" nie musisz dopisywac, w porownaniach C samo nieproszone
przeksztalca wartosci niezerowe na true i zero na false, NULL na 0 i 0 na
NULL
itd. zamiast zwrocic blad "type mismatch", wiec z bolem serca mozna z tego
skorzystac skracajac nieco kod zrodlowy.

Pozdrawiam
Piotr Wyderski



========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "entroper" <entroper_at_nospam_CWD.spamerom.poczta.onet.pl>
Subject: Re: keil raz jeszcze...
Date: Mon, 15 Sep 2003 13:45:16 +0200


Piotr Wyderski napisał(a) w wiadomości: ...

Albo ksiazka klamie, albo Ty zaniedbales kontekst. :-) x & y to jest
operacja na wektorze bitowym (w szczegolnosci na znaku) i jej
wynikiem jest rowniez wektor bitowy, stad trudno przypuszczac, by
mogl sie on rownac true albo false.

W czym problem ? Niezerowy wektor bitowy jest traktowany jako logiczne 1,
zerowy jako 0. Przejrzenie listingu ujawnia, ze operacja jest zazwyczaj
przeprowadzana krotko i sprawnie np. przez skok warunkowy gdy akumulator
jest (nie)zerowy. Jakos nie narzekam na te "nieproszona" konwersje typow,
szczegolnie ze jest ona chyba najnaturalniejsza z naturalnych. Oczywiscie
dotyczy to zapisu

if(x & y)

Spotkalem sie w jednym kompilatorze z bledem, polegajacym na rzutowaniu
wektora bitowego na wartosc logiczna przez wziecie najmlodszego bitu
(zrzutowanie bajtu na bit a potem na wartosc logiczna). W przypadku zapisu

if((x & y) == y)

ten problem oczywiscie nie istnieje. Nie spotkalem sie nigdy z sugerowanym
bledem rzekomego usuwania "==y". Bylby to ewidentny blad kompilatora.

pozdrawiam
entrop3r



========
Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!newsfeed.gazeta.pl!news.nask.pl!news-stoc.telia.net!217.209.241.210.MISMATCH!news-stod.telia.net!telia.net!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Piotr Wyderski" <piotr.wyderskiREMOWE_at_nospam_wp.pl>
Subject: Re: keil raz jeszcze...
Date: Mon, 15 Sep 2003 22:33:51 +0200



entroper wrote:

W czym problem ?

W tym, ze wektor bitowy to zupelnie inny typ niz jego skladowa
i nie mozna wprost dokonac unifikacji obu typow. Tak samo jest
np. w przypadku zbioru jednoelementowego. Jest jasne, ze nie
jest on rownowazny swojemu elementowi, {a} != a. Jest to po
prostu niedopuszczalne na poziomie formalnym.

Niezerowy wektor bitowy jest traktowany jako logiczne 1,
zerowy jako 0.

Ale to wymaga niejawnej konwersji typu {0,1}^n -> bool.
Porzadne jezyki programowania nie zezwalaja na automatyczna
zmiene typu argumentu i zglaszaja to uzytkownikowi jako blad
systemu typow, wymuszajac jawne rzutowanie, a w C nawet
nie dostaniesz informacji, ze cos jest nie tak. Zreszta takich
kwiatkow jest wiecej.

Jakos nie narzekam na te "nieproszona" konwersje typow,
szczegolnie ze jest ona chyba najnaturalniejsza z naturalnych.

Sa ludzie, ktorzy narzekaja, a ja sie do nich zaliczam, bo na
pierwszym miejscu stawiam sobie elegancje i spojnosc formalna
jezyka. Przyznaje, ze C jest wygodnym narzedziem, uzywam
go i bede uzywal oraz uczyl tego jezyka studentow informatyki,
ale nie zmienia to faktu, ze od strony formalnej to jest potworek.

Spotkalem sie w jednym kompilatorze z bledem, polegajacym na rzutowaniu
wektora bitowego na wartosc logiczna przez wziecie najmlodszego bitu
(zrzutowanie bajtu na bit a potem na wartosc logiczna).

A to jest niezgodnosc ze standardem, czyli blad kompilatora.

Pozdrawiam
Piotr Wyderski



========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "entroper" <entroper_at_nospam_CWD.spamerom.poczta.onet.pl>
Subject: Re: keil raz jeszcze...
Date: Tue, 16 Sep 2003 18:13:10 +0200


Piotr Wyderski napisał(a) w wiadomości: ...

W tym, ze wektor bitowy to zupelnie inny typ niz jego skladowa
i nie mozna wprost dokonac unifikacji obu typow. Tak samo jest
np. w przypadku zbioru jednoelementowego. Jest jasne, ze nie
jest on rownowazny swojemu elementowi, {a} != a. Jest to po
prostu niedopuszczalne na poziomie formalnym.

Jak dla kogo, w kazdym razie jeszcze mi sie bity z bajtami nie myla :)

Niezerowy wektor bitowy jest traktowany jako logiczne 1,
zerowy jako 0.

Ale to wymaga niejawnej konwersji typu {0,1}^n -> bool.

Owszem, wymaga. Ale jesli ktos pisze "if" to powinien miec swiadomosc, ze
wszystko co w nim jest zostanie zrzutowane na warunek logiczny. Jesli nie
zrobi tego jawnie, wtedy bez jego kontroli zrobi sie to niejawnie,
niekoniecznie w sposob w jaki by chcial. Nie sadze zeby to byla jakas wielka
wada jezyka C. Poza tym rzutowanie czegokolwiek na wartosc logiczna jest
umowne i w tym sensie uzywanie konwersji jawnej przed niczym nas nie
chroni - w pewnym sensie porownujemy slodkie z niebieskim - ale jakos trzeba
to zrobic. Dlatego umowa zwykle jest taka, ze 0x00 to false a reszta
wartosci to true i ma to scisly zwiazek z traktowaniem bajtu(ow) jako
warunku skoku przez CPU. Rownie dobrze mogloby byc odwrotnie, bo sa i
instrukcje JNZ, mozna wymyslic tez jakies bzdurne formalizmy typu true =
parity(x) (w koncu flaga parzystosci tez jest) ale jednak jest naturalnie i
w miare blisko sprzetu, za co sobie C cenie.

Porzadne jezyki programowania nie zezwalaja na automatyczna
zmiene typu argumentu i zglaszaja to uzytkownikowi jako blad
systemu typow, wymuszajac jawne rzutowanie, a w C nawet
nie dostaniesz informacji, ze cos jest nie tak. Zreszta takich
kwiatkow jest wiecej.

uwazasz C za nieporzadny jezyk ? No coz, polecam assembler, tam sa sztywne
konwencje, jasne konstrukcje i nie mozna sie niczego uczepic.

Jakos nie narzekam na te "nieproszona" konwersje typow,
szczegolnie ze jest ona chyba najnaturalniejsza z naturalnych.

Sa ludzie, ktorzy narzekaja, a ja sie do nich zaliczam, bo na
pierwszym miejscu stawiam sobie elegancje i spojnosc formalna
jezyka. Przyznaje, ze C jest wygodnym narzedziem, uzywam
go i bede uzywal oraz uczyl tego jezyka studentow informatyki (...)

I wszystko jasne :)


pozdrawiam
entrop3r





========
Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: J.F. <jfox_nospam_at_nospam_poczta.onet.pl>
Subject: Re: keil raz jeszcze...
Date: Sat, 13 Sep 2003 16:41:46 +0200


On Sat, 13 Sep 2003 10:29:27 +0200, news.onet.pl wrote:
Znowu zatrzymalem sie na jakiejs drobnostce. Chcialem zrobic komunikacje
szeregowa miedzy procesorami. W zmiennej typu char znak
mam przechowany bajt danych, ktory chce wyslac szeregowo. Wszystko jest ok,
tylko nie potrafie "rozebrac" bajtu na bity...

Zazwyczaj do komunikacji uzywasz jakiegos interfejsu szeregowego,
nie trzeba "rozbierac" bajtu programowo.

PS. Zmodyfikowalem program jeszcze tak: if (znak & 64 == 64){ ... ale
rowniez nie dziala to prawidlowo. i w wyniku dzialania programu sa same zera
nn1=0, nn2=0, nn3=0.

A powinno - znak nie jest przypadkiem 0 ?

unsigned char znak;
znak = 0x0040;

if( znak & 128 == 1 ){

tego radze unikac.
Nie wiadomo czy kompilator obliczy to jako 128 czy -128.
[a 1 to na pewno nie wyjdzie !]

Mozesz natomiast zapisac
if (znak & 128)

Jesli wynik jest niezerowy - C uznaje to za "true".

if( znak & 64 == 1){ [...]
//3
if(znak & 32 == 1){ [..]

to sie tez zazwyczaj w petli daje i przesuwanie wykorzystuje:

for (i=0;i<8;i++)
{
if (znak & 128) [....]



znak <<= 1
}



========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "entroper" <entroper_at_nospam_CWD.spamerom.poczta.onet.pl>
Subject: Re: keil raz jeszcze...
Date: Mon, 15 Sep 2003 13:11:02 +0200


news.onet.pl napisał(a) w wiadomości: ...

tylko nie potrafie "rozebrac" bajtu na bity...

if((znak & 128) == 128)
....

w ten sposob sprawdzisz, czy najstarszy bit jest "1". Metoda jest prosta i
skuteczna i zupelnie nie wiem, czemu sie Kolegom nie podoba. Zlozenie w
analogiczny sposob dwoch operacji - OR (sprawdzanie zer) i AND (sprawdzanie
jedynek) umozliwia sprawdzenie dowolnej maski (np. 101xx011, x oznacza bity
dowolne). Natomiast wykonanie operacji przesuniecia, np:

znak >>= 1;

powoduje zniszczenie zmiennej znak, natomiast uzycie operacji przesuniecia w
warunku:

if (znak & (1<<n))
...

jest zwyczajnie bardzo malo optymalne (np. w '51 spowoduje wygenerowanie n
razy operacji RLC, potem operacji ANL i potem czegos do sprawdzenia, czy
akumulator jest niezerowy)

entrop3r



========
Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not-for-mai