uC programowanie... WinAvr(Atmega16)

Aug 12, 2006 6 Replies

Witam!



Mam pytanie jak mozna inaczej zapisac "bit_is_set(bufor,Ktory)"? To dla mnie bardzo wazne, a szukacjac w necie nie natknelem sie na rozwiazanie.



a wymyslone prze zemnie konstrukcje nie dzialaja...to znaczy:


1) bufor&(1<<Ktory);
2) bufor&(1<<Ktory)==Ktory; czy
3) bufor |= (~(1<<Ktory))&1;


Pozdrawiam, Rafala k.


Dnia 13 Aug 2006 00:36:51 +0200, ToR napisał(a):

1) jest OK. Może czegoś innego zapominasz (np. if ;) )?

Tak jest zresztą definiowane to makro:

#define bit_is_set(sfr, bit) (_SFR_BYTE(sfr) & _BV(bit))

Pozdrawiam Marcin Stanisz

Wykorzystując "#define" zapisałbym to: "#define bit_is_set(bufor, ktory) (bufor&(1<<ktory))". Dodatkowe nawiasy dają Ci możliwość sprawdzenia stanu bitu na "NIE" bez konieczności zastanawiania się nad błędami wywalanymi przez kompilator. Ale ilu "programatorów" to pewnie tyle zdań :-)

Pozdrawiam.

A to?:

bufor |= 1<<n; // ustawia na (n+1) pozycji bufor &= ~1<<n; // zeruje na (n+1) pozycji

pozdr. swinio

U¿ytkownik "ToR" <ToR snipped-for-privacy@o2.pl napisa³ w wiadomo¶ci news: snipped-for-privacy@newsgate.onet.pl...

bit_is _set jest zdefiniowany tak:

#define bit_is_set(sfr, bit) (sfr & _BV(bit))

natomiast _BV:

#define _BV(bit) (1 << (bit))

czyli ponizsza konstrukcja jest poprawna

bufor&(1<<Ktory)

znaczy:

if( bufor & (1<<Ktory) ) {

}

wydaje sie rownowazne:

if( bit_is_set( bufor, Ktory) ) {

}

Pokaz moze dokladnie w jakim kontekscie chcesz tego uzyc.

Wielkie dzieki wszytkim za pomoc! ;)

Okazalo sie ze jak podejrzewaliscie wszytko mialem dobrze z sama definicja dzialania ale myslalem ze ono cos zwraca i wczesniej mialem taka konstrukcje:

if(bufor&(1<<Ktory) == 1) return 1;

a dzieki waszym podpowiedzia zmienilem na

if(bufor&(1<<Ktory)) return 1;

i dziala dobrze ;)!!!

pozdarwiam, Rafal k.

<ToR snipped-for-privacy@o2.pl schrieb

No bo zwraca, ale nie 0 lub 1 tylko binarna koniunkcje czyli 0 lub 1<<Ktory.

Przy okazji zerknalem na wykaz priorytetow i wychodzi, ze == jest silniejsze niz &.

Zatem najblizsze poprawne bedzie takie: if ( (bufor&1<<Ktory) != 0) return 1;

hej

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required