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
--------
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
Brak komentarzy:
Prześlij komentarz