System binarny, dziesiętny, hexadecymalny
W kodowaniu urządzeń zewnętrznych, np. czujników, z którymi komunikujemy się po magistrali i2c, często musimy się zmierzyć z różną formą zapisu liczb. Powszechnie stosowanymi są właśnie system binarny, czy hexadecymalny. Aby móc swobodnie poruszać się w kodowaniu czujników wypadałoby nauczyć się przeliczać wartości zapisywane w tych właśnie systemach.
W życiu codziennym posługujemy się systemem dziesiętnym, czyli takim który bazuje na 10 cyfrach. są to 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Systemy binarny i hexadecymalny są mocno zakorzenione w elektronice gdzie stosuje się je do komunikacji między urządzeniami. Podstawą tego jest najzwyklejsza elektronika i ustalanie sygnałów logicznych 0 i 1. Ale może szkoda teraz czasu na taki wykład. Skupmy się na tym jak przeliczać wartości w poszczególnych systemach.
System binarny
System ten bazuje na dwóch wartościach 0 i 1. W elektronice można też spotkać określenia "stan wysoki" i "stan niski", a w automatyce "prawda" i "fałsz".
Jak zbudować liczbę większą od 1? Robi się to poprzez tworzenie ciągów liczb, w których znaczenie ma zarówno wartość poszczególnej cyfry jak i jej miejsce w danym ciągu.
Może tak - jaka jest różnica między bit'em a byte'em?
Ano taka, że bit to właśnie pojedyncza cyfra o wartości 0 lub 1, a byte to zestaw ośmiu takich cyfr. Jak już wspomniałem miejsce w ciągu liczb ma znaczenie. Poniżej można zobaczyć za jaką wartość odpowiada dana pozycja w ciągu.
x x x x x x x x
128 64 32 16 8 4 2 1
Skoro już wiemy jakie wartosci związane są z pozycją, to należy tylko dodać, że wartość 0 lub 1 oznacza, że dana wartość istnieje lub nie w danym przypadku. Przeliczanie liczby zapisanej w systemie binarnym na system dziesiętny polega na sprawdzeniu które pozycje mają wartość 1, czyli występują, a nastęnie na ich dodaniu. W ten sposób poznajemy wartość w systemie dziesiętnym.
Poniżej kilka przykładów.
128 64 32 16 8 4 2 1
0 0 0 0 0 0 0 0 = 0
0 0 0 0 0 0 0 1 = 1
0 0 0 0 1 0 1 0 = 8 = 2 = 6
1 0 0 0 0 1 1 0 = 128 + 4 + 2 = 134
1 1 1 1 1 1 1 1 = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255
Jak można zauważyć maksymalna wartość 1 byte'a czyli 8 cyfr, to 255. Biorąc pod uwagę jednak, że istnieje też taka wartość jak zero, jeden bajt ma możliwość określenia 256 wartości w systemie dziesiętnym.
W Pythonie, w którym będziemy programować wartości binarne definiuje się w sposób następujący:
0b00000000
Najpierw cyfra zero, na drugiej pozycji jest litera "b", a następnie 8 cyfr z przedziału <0,1>.
Sprawa jest o tyle istotna, że w czujnikach posługujących się złożoną komunikacją (byte'ami) każdy bit ma inne znaczenie, np. pierwsze cztery odpowiadają za adres, piąty za to czy informacja ma charakter do odczytu czy do zapisu, a trzy kolejne zawierają wartość do przekazania. Może to brzmi trochę niejasno, ale w miarę przebijania się przez dokumentację czujników, zrozumiesz o co chodzi. :)
Ot cała filozofia w zapisie wartości w systemie binarnym.
System hexadecymalny (szesnastkowy)
System hexadecymalny jest krótszą formą zapisu tych samych informacji. Innymi słowy możemy zapisać w tym systemie dowolną wartość zapisaną w systemie binarnym czy dziesiętnym.
Jedna cyfra w tym systemie może mieć wartość od 0 do 9 lub od A do F. Co to oznacza? Ile to jest?
0 1 2 3 4 5 6 7 8 9 A B C D E F
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Jak widać odpowiadająca temu wartość w systemie dziesietnym może mieć maksymalnie 15, ale że zero też się liczy, możemy zapisać 16 różnych wartości.
Wartość 1 byte'a w systiemie szesnastkowym to dwie cyfry. Idea przeliczania tego na system dziesietny polega na tym, że pierwszą cyfrę od lewej mnożymy razy wartość 16, a następnie dodajemy ją do wartosci drugiej cyfry.
Poniżej kilka przykładów.
0x00 = 0 x 16 + 0 = 0
0x0b = 0 x 16 + 11 = 11
0x23 = 2 x 16 + 3 = 32 + 3 = 35
0xAF = 10 x 16 + 15 = 175
W Pythonie dla oznaczenia systemu szesnastkowego, przed podaniem dwóch cyfr stosuje się zapis "0x" co w wolnym tłumaczeniu oznacza "liczba hex".
Czyli podając liczbę w systemie hexadecymalnym wygląda ona tak 0x3B, lub np. 0xB4.
Powyższe stety/niestety należy opanować, jeżeli chcemy na dłuższą metę bawić się w programowanie czujników bazujących na komunikacji złożonej (byte'owej).
Powodzenia... :)