Mikrokontrolery - Jak zacząć?

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

czwartek, 10 lutego 2011

Kurs języka C: Operator mnożenia bitowego &


Autor: Dondu

Kurs języka C: Spis treści

Operator bitowy & realizuje operację mnożenia bitowego. Wynikiem mnożenia bitowego jest jedynka tylko i wyłącznie wtedy, gdy na tych samych pozycjach bity są jedynką. W pozostałych przypadkach wynikiem jest zero.
76543210 numery bitów
--------
10110010 zmienna a
10011000 zmienna b
--------
10010000 wynik mnożenia bitowego: a & b


Przykład 1 (w kompilatorze)
  unsigned char a = 0b10110010;
  unsigned char b = 0b10011000;
  unsigned char wynik;

  wynik = a & b;  //mnożenie bitowe AND

Wynik działania programu możesz zobaczyć w kompilatorze CManiak.


Łączenie operatorów: &=

Jak każdy inny operator, także i ten można łączyć z operatorem przypisania.

Przykład 2 (w kompilatorze)
  wynik &= a;  //odpowiednik: wynik = wynik & a;




Podstawowe zastosowania:

Poniżej przykłady zastosowania mnożenia bitowego. Będziemy w nich używać tzw. maski bitów, czyli liczby z odpowiednio ustawionymi bitami, w zależności od potrzeb.


1. Zerowanie wybranych bitów.
W przypadku, gdy chcemy wyzerować jakieś bity wystarczy wykonać mnożenie bitowe danej zmiennej z maską, w której bity, które mają być wyzerowane są zerami, a te które mają zostać niezmienione są jedynkami.

Na przykład chcemy w zmiennej a wyzerować bit 1 oraz bit 4. Mnożymy więc bitowo zmienną a z maską ustawioną wg powyższej zasady:

76543210 numery bitów
--------
10110010 zmienna a
11101101 maska
--------
10100000 zmienna a z wyzerowanymi bity 1 i 4


Przykład 3 (w kompilatorze)
  unsigned char a = 0b10110010;

  //zeruj bity 1 i 4
  a &= 0b11101101;  //odpowiednik: a = a & 0b11101101;



2. Sprawdzenie wybranego bitu.
Jeżeli chcemy ustalić, czy dany bit ma wartość jeden lub zero, wystarczy dokonać mnożenia bitowego z maską gdzie sprawdzany bit jest jedynką, a następnie sprawdzić, czy wynik jest różny od zera. Wykorzystamy tutaj pewną właściwość instrukcji if( ) upraszczającą zapis do niezbędnego minimum.


Przykład 4 (w kompilatorze)
  unsigned char a = 0b10110010;

  //sprawdzamy wybrany bit
  if(a & 0b00010000){
    //bit jest jedynką
  }else{
    //bit jest zerem
  }


3. Sprawdzenie, czy co najmniej  jeden z kilku bitów jest jedynką.
Jeżeli chcemy ustalić, czy któryś z kilku bitów ma wartość jeden postępujemy podobnie jak w przykładzie powyżej.


Przykład 5 (w kompilatorze)
  
  unsigned char a = 0b10110010;

  //sprawdzamy wybrane bity
  if(a & 0b00010001){
    //co najmniej jeden z bitów jest jedynką
  }else{
    //żaden z bitów nie jest jedynką
  }


4. Sprawdzenie, czy wszystkie wybrane bity są jedynkami.
Ten przypadek jest nieco bardziej skomplikowany. Gdy chcemy ustalić, czy wszystkie z kilku wybranych bitów mają wartość jeden, musimy najpierw dokonać mnożenia bitowego z maską, a później sprawdzić czy to co zostało jest dokładnie tym czego oczekiwaliśmy, czyli maską.


Przykład 6 (w kompilatorze)
  
  unsigned char a = 0b10110010;

  //sprawdzamy wybrane bity 
  if((a & 0b00010010) == 0b00010010){
    //wszystkie wybrane bity są jedynkami
  }else{
    //co najmniej jeden z wybranych bitów nie jest jedynką
  }

W przykładach znajdują się liczby w zapisie dwójkowym, ale oczywiście można je zastąpić szesnastkowymi lub definicjami bitów, czy całych masek.

Kurs języka C: Spis treści

12
Oceń artykuł.
Wasze opinie są dla nas ważne, gdyż pozwalają dopracować poszczególne artykuły.
Pozdrawiamy, Autorzy
Ten artykuł oceniam na:

3 komentarze:

  1. Dlaczego w kursie są pokazywane rzeczy, które nie pojawiały się w poprzednich jego częściach? Proszę wybaczyć moją być może zerową wiedzę, ale jestem zupełnie "zielony" i chciałbym uczyć się krok po kroku, podczas gdy w kolejnych częściach kursu, czy też w przykładach z kompilatora pojawiają się rzeczy wcześniej nie wyjaśnione, chociażby funkcja, która ma wyświetlać wynik mnożenia binarnego, nie mówiąc już o tym, że samo pojęcie funkcji, jej definiowania etc. nie zostało wcześniej zdefiniowane. Proszę wybaczyć tą krytykę, ale po prostu z początku kurs ten wydał mi się świetną okazją, aby sprawnie nauczyć się programowania w tym języku.

    OdpowiedzUsuń
  2. Rozpocząłem pisanie kursu 2 sierpnia 2012. Do dzisiaj ukazały się 33 artykuły, czyli około jednego dziennie. To całkiem sporo, a czas nie jest z gumy :-)

    Dlatego też na stronie spisu treści kursu umieściłem informację, że proszę o cierpliwość.

    Kolejność powstawania artykułów generalnie nie jest przypadkowa, ale faktycznie brakuje na ten moment artykułu o funkcjach.

    Co do funkcji konwersji na postać binarną (sądzę, że o niej piszesz), to świadomie nie tłumaczę jej zasady działania, ponieważ obejmuje to wiele zagadnień, które trzeba znać, by zrozumieć. Proszę po prostu ją używać :-)

    OdpowiedzUsuń
  3. Czegoś tutaj nie rozumiem...
    Patrząc na przykład zastosowania nr. 3 (Sprawdzenie, czy co najmniej jeden z kilku bitów jest jedynką), to aby to sprawdzić nie powinniśmy użyć maski z samymi jedynkami (0b11111111), bo moim zdaniem tylko wtedy sprawdzimy, czy na którejkolwiek pozycji w zmiennej a któryś bit jest jedynką. To wydaje mi się logiczne, jeżeli się mylę proszę mnie poprawić ;)
    Pozdro.

    OdpowiedzUsuń

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.