Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Przesunięcie bitowe i operacja OR

nel4eth 08 Sty 2012 00:16 1457 3
  • #1 08 Sty 2012 00:16
    nel4eth
    Poziom 7  

    Witam

    Mam następujący kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Oczywiście na początku są includy do io.h i delay.h - mam podlaczone diody pod port D i 2 przyciski pod port B - naciskam przycisk 1 i zaświecają się diody po kolei, naciskam drugi i gasną w odwrotnej kolejności.

    Pytanie: dlaczego przy wyświetlaniu jest przesunięcie bitowe a następnie bitowe OR a przy wygaszaniu diód tylko przesunięcie bitowe ?

    Naturalnie wszystko w tej chwili działa jak powinno ale ten OR nie daje mi spokoju :)

    Pozdrawiam
    Adam

    0 3
  • Pomocny post
    #2 08 Sty 2012 00:28
    pietrucha
    Poziom 16  

    Kiedy przesuwasz bitowo jakąś wartość, np 0001(binarnie), to na ostatnim bicie pojawia się zero, czyli 0001 << 1 = 0010. W ten sposób, zakładając, że miałbyś na początku włączoną jedną diodę, po naciśnięciu przycisku zapaliłaby się kolejna, a tamta zgasła. Dlatego dajesz OR, który zapala Ci ostatni bit - czyli za każdym razem zapalone diody są przesunięte w lewo i zapalana jest jeszcze jedna, pierwsza:

    Code:
    0001
    
    0011
    0111 itd.

    W bez OR wyglądałoby to tak:
    Code:
    0001
    
    0010
    0100

    Kiedy przesuwasz w prawo, wszystkie bity zmieniają swoje miejsce, z wyjątkiem pierwszego, który po prostu jest odrzucany:
    Code:
    0111
    
    0011
    0001

    0
  • Pomocny post
    #3 08 Sty 2012 00:41
    Electix
    Poziom 20  

    Przy włączaniu diod jest po przesunięciu dodany OR po to żeby ustawić logiczną "1" w miejscu "0" które powstało po wcześniejszym przesunięciu jedynki w lewo. Gdy są gaszone diody, to nie ma takiej potrzeby gdyż przesuwana w prawo wartość rejestru jest po prostu z niego wysuwana.

    Obrazowo:
    1. Rejestr PORTD w pierwszym kroku zawiera wartość: PORTD=0b00000000
    2. Robiąc operację PORTD<<=1 wsuwasz do rejestru na najmłodszy bit 1 czyli w rejestrze robi się: PORTD=0b00000001
    3. Operacja PORTD|=1; to inaczej PORTD=PORTD|0b00000001, a 1 OR 1 daje w wyniku 1 czyli zawartość porty się nie zmieni.
    4. Kolejne przyciśnięcie przycisku przesuwa bit z pozycji 0 na pozycje 1 czyli w wyniku tej operacji w rejestrze będzie PORTD=0b00000010
    5. Wykonanie operacji OR w tym wypadku ustawi na pozycji zerowej 1 czyli rejestr będzie zawierał wartość PORTD=0b00000011 co będzie powodować świecenie 2 diod i tak aż do zaświecenia wszystkich czterech.
    6. Teraz naciskasz drugi przycisk i wysuwasz zawartość rejestru w prawo.
    Czyli jak miałeś zapalone 4 diody czyli w rejestrze PORTD=0b00001111;
    po wykonaniu operacji PORTD>>=1 będziesz mieć w rejestrze PORTD=0b00000111 czyli trzy świecące diody.
    7. Operacja OR jest nie potrzebna, bo tu nie musisz uzupełniać zer powstałych po przesunięciu jedynek.

    Zrozumiał? :)

    0
  • #4 08 Sty 2012 00:50
    nel4eth
    Poziom 7  

    Witam

    Oczywiście - obaj wyjaśniliście to bardzo dobitnie - zweryfikowane empirycznie - faktycznie bez OR 1 się przesuwa gasząc za sobą diody :)

    Ok wygląda na to że na dzisiaj wystarczy ;)

    Dzięki bardzo za wyjaśnienie

    Pozdrawiam
    Adam

    0