algorytm.org

Zamiana z i na system dziesiętny



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Zamiana z i na system dziesiętny
Ocena użytkowników:***** / 150
SłabyŚwietny 
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;

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
AutorJęzyk
programowania
KomentarzOtwórzPobierzOcena
Tomasz LubińskiAda
.ada
.ada
***** / 4
Tomasz LubińskiC#MS Visual Studio .net
.cs
.cs
***** / 7
Tomasz LubińskiC/C++
.cpp
.cpp
***** / 12
MarianC/C++C++ (zamiana z systemu dziesietnego)
.cpp
.cpp
***** / 44
MarianC/C++C++ (zamiana na system dziesiętny)
.cpp
.cpp
***** / 41
Tomasz LubińskiDelphi/Pascal
.pas
.pas
***** / 3
Tomasz LubińskiJava
.java
.java
***** / 9
Anna GiełczyńskaJavaScriptZamiana na system binarny
.js
.js
***** / 15
Jakub KoniecznyJava_Block
.jbf
.jbf
***** / 1
Jakub KoniecznyPython
.py
.py
***** / 15
 
Dodaj własną implementację tego algorytmu
  • Zaloguj się na stronie
Plik:
Język
programowania:
Komentarz:
  By móc dodać implementacje zaloguj się na stronie

Poprawiony: 24 lutego 2011 21:13
Komentarze
photo
-17 # paatuunia 2011-10-08 09:38
zamienic 2011(2) na system szesnastkowy
4(2) na szesnastkowy
10 (2) na szesnastkowy
poomozecie pliss; D
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-24 # wiedzmac 2011-10-08 13:27
W systemie dwójkowym występują tylko cyfr 1 i 2 - dlatego zapis 2011 oraz 4 jest błędny, a zatem nie można go zamienić na inny system liczbowy.
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
+6 # facepalm 2012-01-29 15:01
Cytuję wiedzmac:
W systemie dwójkowym występują tylko cyfr 1 i 2

1 i 0.
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
+2 # valgodeskom 2014-02-02 03:00
Tak dla zainteresowanyc h na przyszłość. Prosta metoda - i prosta implementacja na dowolny język programowania.

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
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz