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... :)

:)