Mikrokontrolery - Jak zacząć?

... czyli zbiór praktycznej wiedzy dot. mikrokontrolerów.

czwartek, 10 lutego 2011

Kurs języka C: Operator przesuwania bitów w prawo >>


Autor: Dondu

Kurs języka C: Spis treści

Operator przesuwania bitów w prawo >> przesuwa bity o zadaną ilość pozycji uzupełniając zerami najstarsze przesunięte bity. Najmłodszy bit "wypada" i jest gubiony. Przesuwać bity można o dowolną ilość pozycji.

Ponieważ podstawą kodu dwójkowego jest liczba dwa, stąd przesunięcie o jeden bit w prawo, jest równoznaczne z dzieleniem liczb całkowitych przez dwa (bez reszty). Analogicznie przesunięcie o dwa bity jest dzieleniem przez 4, itd.

76543210 numery bitów
--------
11110000 zmienna a
--------
01111000 wynik przesunięcia bitowego w prawo          o jedną pozycję: a = a>>1

Przesuwamy bit o jeden w prawo.

Przykład 1 (w kompilatorze)
  unsigned char a = 0b11110000;
  a = a >> 1;  //przesuń bity o jeden w prawo, a na najstarszy wstaw zero


Bity można przesuwać o dowolną ilość pozycji:

Przykład 2 (w kompilatorze)
  a = a >> 4;  //przesuń bity o cztery w prawo, a na najstarsze wstaw zero


Najmłodszy bit jest tracony.

Przykład 3 (w kompilatorze)
  unsigned char a = 0b00000001;
  a = a >> 1;  //przesuń w prawo o jeden, tracimy najmłodszy bit


Przekroczenie ilości bitów w zmiennej oznaczać będzie, że na wszystkich bitach pojawią się zera.

Przykład 4 (w kompilatorze)
  
  unsigned char a = 0b10000001;
  a = a >> 8;  //przesuń w prawo o osiem pozycji, tracimy wszystkie bity  





Łączenie operatorów: >>=

Operator przesunięcia w prawo może być łączony z operatorem przypisania.

Przykład 5 (w kompilatorze)
  a >>= 1;  //równoznaczny z: a = a >> 1;






Rolowanie bitów w prawo

Rolowanie w prawo, to przesuwanie w prawo z jednoczesnym przenoszeniem wypadającego bitu na najstarszy bit. Niestety język C, to nie assembler i nie posiada operatorów rolowania w prawo. Należy posłużyć się dodatkowym kodem. Poniżej kilka przykładów dla zmiennych typu char.


1. rolowanie w postaci funkcji z użyciem if( ):

Przykład 6 (w kompilatorze)
//funkcja rolująca bity w prawo
unsigned char dd_ror( unsigned char a ) 
{ 
  //sprawdzamy najmłodszy bit (bit tracony przy przesuwaniu w prawo)
  if(a & 0b00000001){ 
    // gdy jest równy jeden 
    return ( (a>>1) | 0b10000000 ); // trzeba przenieść tracony bit na najstarszy 
  }
  
  //gdy jest równy zero
  return (a>>1); //tylko przesuwamy, a standardowo na najstarszym bicie
                 //ląduje zero
} 



2. rolowanie z użyciem definicji z instrukcją wyboru (skrócony if):

Przykład 7 (w kompilatorze)
  //definicja dd_ror()
  #define dd_ror(a) ((a & 0b00000001)? 0b10000000|(a>>1) : a>>1 ) 

Można oczywiście dwa powyższe przykłady "wymieszać" definiują własną funkcję ze skróconym if( ).



3. Rolowanie z użyciem wstawki kodu assemblera:

Przykład 8 (w kompilatorze)
  //przesuń bity o jeden w prawo, za pomocą wstawki kodu assemblera
  asm volatile ("ror %0" : "=r" (a) : "0" (a));





Składnia kodu

Nie ma znaczenia, czy piszesz ze spacjami, czy bez.
  //dozwolone formy
  a = a >> 1;
  a=a>>1;

  a >>= 1;
  a>>=1;

Ale uwaga: Nie może być spacji pomiędzy operatorami!
  //niedozwolone formy
  a >> = 1;




Ćwiczenie

Spróbuj zrozumieć poniższy kod zanim uruchomisz go w kompilatorze CManiak.

Przykład 9
(w kompilatorze)
  unsigned char i;
  unsigned char a = 0b10000000;

  for(i = 0; i<9; i++){
        printf("%d \n",  a);
        a>>=1;
  }
Kurs języka C: Spis treści
17
Oceń artykuł.
Wasze opinie są dla nas ważne, gdyż pozwalają dopracować poszczególne artykuły.
Pozdrawiamy, Autorzy
Ten artykuł oceniam na:

Brak komentarzy:

Prześlij komentarz

Działy
Działy dodatkowe
Inne
O blogu




Dzisiaj
--> za darmo!!! <--
1. USBasp
2. microBOARD M8


Napisz artykuł
--> i wygraj nagrodę. <--


Co nowego na blogu?
Śledź naszego Facebook-a



Co nowego na blogu?
Śledź nas na Google+

/* 20140911 Wyłączona prawa kolumna */
  • 00

    dni

  • 00

    godzin

  • :
  • 00

    minut

  • :
  • 00

    sekund

Nie czekaj do ostatniego dnia!
Jakość opisu projektu także jest istotna (pkt 9.2 regulaminu).

Sponsorzy:

Zapamiętaj ten artykuł w moim prywatnym spisie treści.