Konwersje systemów liczbowych
Podczas pisania programów dla mikrokontrolerów zazwyczaj mamy do czynienia z 3 różnymi systemami liczbowymi: dziesiętnym, binarnym i szesnastkowym (lub heksadecymalnym). Używamy dziesiętnego, ponieważ przychodzi nam to naturalnie; tak właśnie liczymy. Niestety, nie jest to sposób, w jaki liczą komputery. Ponieważ komputery i mikrokontrolery są ograniczone do 1 i 0, liczą za pomocą ciągów tych liczb. Jest to binarny system liczbowy. Liczby binarne są zwykle poprzedzone znakami „0b”, które nie są częścią liczby. Czasami są one również podzielone na grupy po 4 cyfry, aby ułatwić ich odczytanie, jak również łatwiej odnieść je do szesnastkowego systemu liczbowego. Przykładem liczby binarnej jest 0b0100.1011. Okresy w numerze nie reprezentują niczego, oni po prostu sprawiają, że łatwiej odczytać numer.
System binarny jest prosty do zrozumienia, ale trzeba dużo cyfr, aby użyć systemu binarnego do reprezentowania dużych liczb. System szesnastkowy może reprezentować znacznie większe liczby przy użyciu mniejszej liczby znaków, i jest bardzo podobny do liczb binarnych. Liczby szesnastkowe są zwykle poprzedzone znakami „0x”, które nie są częścią liczby. Pojedyncza cyfra szesnastkowa może reprezentować cztery cyfry binarne!
Liczby binarne mogą składać się tylko z cyfr 1 i 0; zazwyczaj liczba binarna składa się z 8 cyfr (lub jakiejś wielokrotności 8), jeśli jest używana w jakimś komputerze (lub mikrokontrolerze). Warto wiedzieć, jak przekonwertować liczbę binarną na dziesiętną i odwrotnie. Jak więc konwertować pomiędzy systemami liczbowymi? Najpierw zastanówmy się, jak określamy wartość liczby dziesiętnej. Liczba 268 może być rozbita jako 200 + 60 + 8, lub 2 * (10^2) + 6 * (10^1) + 8 * (10^0). Istnieją dwie ważne liczby, które musimy znać, aby „zdekonstruować” liczbę – podstawa systemu liczbowego i położenie cyfry w liczbie. Podstawą liczby dziesiętnej jest 10. Kiedy zamieniamy liczbę 268, 2 jest drugą cyfrą, 6 jest pierwszą cyfrą, a 8 jest cyfrą zerową. Każda cyfra musi być skalowana zgodnie z jej miejscem w liczbie. Skala cyfry jest podstawą systemu liczbowego podniesioną do potęgi miejsca cyfry w liczbie. Tak więc każda cyfra jest skalowana, a następnie wszystkie skalowane cyfry są dodawane, aby znaleźć całkowitą wartość liczby.
Tej samej metody można użyć do znalezienia wartości liczby binarnej. Na przykład, spójrzmy na liczbę 0b1011.0101. Podstawą systemu binarnego jest 2 (przedrostek 0b jest często używany w kodzie, aby wskazać, że liczba jest w formacie binarnym). Wartość naszej liczby wynosi: 1*(2^7)+0*(2^6)+1*(2^5)+1*(2^4)+0*(2^3)+1*(2^2)+0*(2^1)+1*(2^0), co jest równe 181.
0b1011.0101. Cóż za zupełnie nieefektywny sposób na wpisanie liczby! Ale możemy reprezentować tę samą liczbę binarną używając tylko 2 cyfr szesnastkowych. Najpierw jednak zaczniemy od konwersji liczby szesnastkowej (heksadecymalnej) na dziesiętną, tak jak to zrobiliśmy dla liczby binarnej. Co powiesz na 0xB5? Czekaj, co?! Przedrostek 0x jest używany w kodzie, aby wskazać, że liczba jest zapisywana w systemie szesnastkowym. Ale co robi tam 'B’? Format szesnastkowy ma podstawę 16, co oznacza, że każda cyfra może reprezentować do 16 różnych wartości. Niestety, po cyfrze '9′ kończą nam się cyfry, więc zaczynamy używać liter. Litera 'A’ reprezentuje 10, 'B’ – 11, 'C’ – 12, 'D’ – 13, 'E’ – 14, a 'F’ – 15. 'F’ jest największą cyfrą w systemie numeracji heksadecymalnej. Konwertujemy tę liczbę w taki sam sposób jak poprzednio. Wartość 0xB5 wynosi więc: B*(16^1)+5*(16^0) lub 181.
Wiedza jak konwertować binarny i heksadecymalny na dziesiętny jest ważna, ale najbardziej użyteczną konwersją liczb jest prawdopodobnie konwersja pomiędzy heksadecymalnym i binarnym. Te dwa systemy numeracji faktycznie działają całkiem dobrze razem. Systemy numeracji są powiązane w taki sposób, że pojedyncza cyfra heksadecymalna reprezentuje dokładnie 4 cyfry binarne, a więc 2 cyfry heksadecymalne mogą reprezentować 8 bitów (lub cyfr binarnych). Oto tabela, która pokazuje jak każda cyfra heksadecymalna jest powiązana z systemem binarnym:
Wartość binarna | Wartość szesnastkowa |
0000 | 0 |
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | 8 |
1001 | 9 |
1010 | A |
1011 | B |
1100 | C |
1101 | D |
1110 | E |
1111 | F |
Na przykład, aby przekonwertować liczbę heksadecymalną 0x1C na binarną, znaleźlibyśmy odpowiednią wartość binarną dla 1 i C i połączylibyśmy je. Tak więc, 0x1C w systemie binarnym to 0b0001.1100. Jeśli chcielibyśmy znaleźć wartość heksadecymalną dla liczby binarnej, po prostu idziemy w drugą stronę. Aby znaleźć reprezentację heksadecymalną liczby binarnej 0b0010.1011 najpierw znajdujemy wartość heksadecymalną dla 0010, a następnie wartość heksadecymalną dla 1011 i łączymy je; wartość heksadecymalna to 0x2B.
Istnieje wiele darmowych narzędzi, które pomagają w konwersji między tymi systemami numeracji, wystarczy wpisać w google „hex number conversion”. Jeśli używasz Windows jako systemu operacyjnego, masz świetne narzędzie wbudowane w kalkulator. Po prostu zmień kalkulator na tryb naukowy i możesz konwertować między systemami liczbowymi, wpisując liczbę, a następnie zmieniając format kalkulatora!
.