Wpisany przez Tomasz Lubiński,
23 listopada 2006 23:52
Każdą liczbę przedstawić można w dowolnym systemie liczbowym. Na codzień używamy systemu dziesiętnego, którego podstawą jak nazwa wskazuje jest liczba 10. Oznacza to, że do zapisu każdej liczby mamy do dyspozycji 10 cyfr: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Jednak w informatyce często zachodzi potrzeba posługiwania się innymi systemami. Na przykład dwójkowym (binarnym), którego podstawą jest 2, a każdą liczbę w nim zapisujemy przy pomocy 0 oraz 1. Często też spotkać możemy się systemem szesnastkowym, w którym liczby zapisywane są przy pomocy: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, A, B, C, D, E, F. Widać tutaj, że do zapisu kolejnych cyfr oznaczających 10, 11, 12, ... używamy kolejnych liter alfabetu.
Żeby się w tym wszystkim nie pogubić przy każdej liczbie w nawiasie podawać będziemy system w jakim jest zapisana. Czyli 100 w systemie dziesiętnym to: 100(10), a 100 w systemie dwójkowym to: 100(2).
Zamiana z systemu dziesiętnego na inny.
By zamienić liczbę dziesiętną na jej reprezentację w innym sytemie wystarczy dzielić ją dopóki jest różna od zera przez podstawę nowego systemu, a reszty z tych dzieleń zapisywać od prawej do lewej - otrzymując w ten sposób wynik. Wyjątkiem od tego postępowania jest zero, które w każdym systemie jest poprostu zerem.
W pseudokodzie możemy to zpisać następująco (n - liczba do zamiany, base - baza nowego systemu):
pattern = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
result = "";
while (n>0) do
begin
result = pattern[n mod base] + result;
n = n / base;
end;
Zamienimy liczbę 74(10) na jej postać dwójkową:
74 / 2 = 37 reszta 0, zatem wynik = '0'
37 / 2 = 18 reszta 1, zatem wynik = '10'
18 / 2 = 9 reszta 0, wynik = '010'
9 / 2 = 4 reszta 1, wynik = '1010'
4 / 2 = 2 reszta 0, wynik = '01010'
2 / 2 = 1 reszta 0, wynik = '001010'
1 / 2 = 0 reszta 1, wynik = '1001010'
Zatem 74(10) = 1001010(2)
Teraz policzmy jeszcze jej postać szesnastkową (heksadecymalną):
74 / 16 = 4 reszta 10, do zapisu '10' jak już wspominaliśmy użyjemy litery A, zatem wynik = 'A'
4 / 16 = 0 reszta 4, więc wynik = '4A'
Zatem 74(10) = 1001010(2) = 4A(16)
Zamiana innego systemu na dziesiętny.
By dowiedzieć się jaką wartość ma liczba zapisana w systemie innym niż dziesiętny należy obliczyć następujące wyrażenie:
a0*baza0 + a1*baza1 + ... + am*bazam
Gdzie liczba a zapisana jest w systmie baza i składa się z m znaków, przy czym a0 oznacza znak najmniej znaczący (najbardziej na prawo).
W pseudokodzie możemy to zpisać następująco (a - liczba do zamiany, base - baza systemu, w którym zapisana jest liczba a, valueOf(x) - zwraca wartość liczbową znaku - np: 1 dla '1', 11 dla 'B'):
p = 1;
result = 0;
for i:=length(a)-1 downto 0
begin
x = valueOf(a[i]);
result = result + (x * p);
p = p*base;
end;
Zamienimy liczbę 3E2(16) na jej postać dziesiętną:
Początkowo: result = 0, p = 1
Pierwszy krok: result = 0 + 2*1 = 2, p = 1 * 16 = 16
Kolejny krok algorytmu: result = 2 + E*16 = 2 + 14*16 = 226, p = 16 * 16 = 256
I ostatni krok algorytmu: result = 226 + 3*256 = 994, p = 256 * 16 = 4096
Zatem 3E2(16) = 994(10)
Żeby się w tym wszystkim nie pogubić przy każdej liczbie w nawiasie podawać będziemy system w jakim jest zapisana. Czyli 100 w systemie dziesiętnym to: 100(10), a 100 w systemie dwójkowym to: 100(2).
Zamiana z systemu dziesiętnego na inny.
By zamienić liczbę dziesiętną na jej reprezentację w innym sytemie wystarczy dzielić ją dopóki jest różna od zera przez podstawę nowego systemu, a reszty z tych dzieleń zapisywać od prawej do lewej - otrzymując w ten sposób wynik. Wyjątkiem od tego postępowania jest zero, które w każdym systemie jest poprostu zerem.
W pseudokodzie możemy to zpisać następująco (n - liczba do zamiany, base - baza nowego systemu):
pattern = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
result = "";
while (n>0) do
begin
result = pattern[n mod base] + result;
n = n / base;
end;
Przykład:
Zamienimy liczbę 74(10) na jej postać dwójkową:
74 / 2 = 37 reszta 0, zatem wynik = '0'
37 / 2 = 18 reszta 1, zatem wynik = '10'
18 / 2 = 9 reszta 0, wynik = '010'
9 / 2 = 4 reszta 1, wynik = '1010'
4 / 2 = 2 reszta 0, wynik = '01010'
2 / 2 = 1 reszta 0, wynik = '001010'
1 / 2 = 0 reszta 1, wynik = '1001010'
Zatem 74(10) = 1001010(2)
Teraz policzmy jeszcze jej postać szesnastkową (heksadecymalną):
74 / 16 = 4 reszta 10, do zapisu '10' jak już wspominaliśmy użyjemy litery A, zatem wynik = 'A'
4 / 16 = 0 reszta 4, więc wynik = '4A'
Zatem 74(10) = 1001010(2) = 4A(16)
Zamiana innego systemu na dziesiętny.
By dowiedzieć się jaką wartość ma liczba zapisana w systemie innym niż dziesiętny należy obliczyć następujące wyrażenie:
a0*baza0 + a1*baza1 + ... + am*bazam
Gdzie liczba a zapisana jest w systmie baza i składa się z m znaków, przy czym a0 oznacza znak najmniej znaczący (najbardziej na prawo).
W pseudokodzie możemy to zpisać następująco (a - liczba do zamiany, base - baza systemu, w którym zapisana jest liczba a, valueOf(x) - zwraca wartość liczbową znaku - np: 1 dla '1', 11 dla 'B'):
p = 1;
result = 0;
for i:=length(a)-1 downto 0
begin
x = valueOf(a[i]);
result = result + (x * p);
p = p*base;
end;
Przykład:
Zamienimy liczbę 3E2(16) na jej postać dziesiętną:
Początkowo: result = 0, p = 1
Pierwszy krok: result = 0 + 2*1 = 2, p = 1 * 16 = 16
Kolejny krok algorytmu: result = 2 + E*16 = 2 + 14*16 = 226, p = 16 * 16 = 256
I ostatni krok algorytmu: result = 226 + 3*256 = 994, p = 256 * 16 = 4096
Zatem 3E2(16) = 994(10)
Implementacje
Autor | Język programowania | Komentarz | Otwórz | Pobierz | Ocena |
Tomasz Lubiński | Ada | .ada | .ada | ***** / 4 | |
Tomasz Lubiński | C# | MS Visual Studio .net | .cs | .cs | ***** / 7 |
Tomasz Lubiński | C/C++ | .cpp | .cpp | ***** / 12 | |
Marian | C/C++ | C++ (zamiana z systemu dziesietnego) | .cpp | .cpp | ***** / 44 |
Marian | C/C++ | C++ (zamiana na system dziesiętny) | .cpp | .cpp | ***** / 41 |
Tomasz Lubiński | Delphi/Pascal | .pas | .pas | ***** / 3 | |
Tomasz Lubiński | Java | .java | .java | ***** / 9 | |
Anna Giełczyńska | JavaScript | Zamiana na system binarny | .js | .js | ***** / 15 |
Jakub Konieczny | Java_Block | .jbf | .jbf | ***** / 1 | |
Jakub Konieczny | Python | .py | .py | ***** / 15 |
Poprawiony: 24 lutego 2011 21:13
4(2) na szesnastkowy
10 (2) na szesnastkowy
poomozecie pliss; D
1 i 0.
Dla liczby całkowitej:
* dzielimy liczbę przez podstawę nowego systemu i odpisujemy resztę z tego dzielenia (to kolejne cyfry w liczbie w nowym systemie), a z całkowitym wynikiem dzielenia postępujesz tak samo (rekurencyjnie)
Dla liczby ułamkowej
* mnożymy część ułamkową liczby przez podstawę nowego systemu i odpisujemy od wyniku część całkowitą (to kolejne cyfry po przecinku w liczbie ułamkowej w nowym systemie), a z pozostałą częścią ułamkową postępujesz tak samo (rekurencyjnie)
Można sobie przeliczać na stronce on line - z różnych systemów na inne, dowolne liczby:
http://systemyliczbowe.urfu.pl