Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Algorytm konwersji liczb z binarnych na dziesiętne
Forum PHP.pl > Inne > Hydepark
KeeL
Witam,

Czy posiada ktoś takowy algorytm, lub byłby tak miły mi napisać?

PS Pytałem wujka, ale nie dał mi odpowiedzi.

Z góry dziękuję i pozdrawiam KeeL


Jeśli ktoś nie wie o jakiego wujka chodzi to pisać na pw.
Pawel_W
człowieku, to jest podstawówka... smile.gif i nie mów, ze szukałeś, bo wystarczy wpisać "liczby binarne" do googla, i pierwsza strona (Wikipedia):
Cytat
Np. liczba zapisana w dziesiętnym systemie liczbowym jako 10, w systemie dwójkowym przybiera postać 1010, gdyż:

jak dalej nie łapiesz zasady, wg której to się zamienia, to trochę niżej masz "Zmiany systemu"
KeeL
to umiem, ale potrzebuje algorytmu który by dało się przepisać na program lub schematu blokowego. Potrzebuje konwersji w dwie strony.
Crozin
A co to jest niby to powyżej jak nie algorytm zamiany?
KeeL
ok, to w takim razię się źle wyraziłem w 1 poście.

Moglibyście mi pomóc jak zamienić ten algorytm na program? Taki krótki opis.
bim2
Ja cię proszę...

Liczysz długosc ciagu zer i jedynek. Lecisz od końca pętlą pobierając konkretny znak z ciągu.
  1. for($i = strlen($ciag); $i>=0; $i--)

Zwiększasz wartośc o jeden jakiejś zmiennej tymczasowej. I normlanie mnożysz z dwójką do potęgi zmiennej tymczasowej oraz dodajesz do wczesniejszych mnożeń.
  1. $liczba += $ciąg{$i} * 2^$tmp;
  2. $tmp++;


Poradzisz sobie tak żeby ci to działało.

Btw. W wszystkich językach istnieją gotowe funkcje do konwersji takich rzeczy raczej winksmiley.jpg

Aha, można jedną rzecz tutaj zoptymalizować ale będzie to zadanie dla ciebie.
Zyx
Pętla idąca od najwyższej potęgi dwójki do najniższej i sprawdzająca czy dana potęga mieści się w liczbie i jeśli tak, odejmująca ją od tej liczby i pisząca "1".
KeeL
Dzięki chłopaki, rozjaśniliście mi już wszystko smile.gif

A z dziesiętnego na binarny zadziałało by takie rozwiązanie:

Pętla, i dzielenie przez 2, jeśli zostaje reszta dopisz 1, a jeżeli nie dopisz 0 do stringa?
Zyx
Raczej nie reszta, bo wtedy będziesz prawie wyłącznie jedynki wypisywać smile.gif. Sprawdzasz wynik dzielenia czy jest większy od zera, a resztę podstawiasz za liczbę do kolejnej iteracji. I tak - to jest inny pomysł na ten algorytm. Ja osobiście wolę wariant z odejmowaniem, gdyż odejmowanie jest wykonywane przez komputer dużo szybciej, niż dzielenie, ale z drugiej strony dzielenie da się uogólnić na dowolny system liczbowy.
KeeL
To który to sposób?

bim2
Zyx, czemu nie reszta? Jeśli podzieli np 10 na 2, zapisze 0, później 5 na 2, zapisze 1, potem (oczywiście zaokrąglanie w dół) 2 na 2, zapisze 0, no i przy jedynce zapisuje 1. Aha, jeszcze trzeba reverse zrobić i dam nam to 1010 winksmiley.jpg
Zyx
A, bo zrozumiałem (nie wiedzieć czemu), że on potęgami dwójki chce dzielić. Faktycznie, było, że dwa. Mój drugi sposób działa przy założeniu, że będziemy przez potęgi dwójki dzielić, a nie przez dwa.
KeeL
smile.gif

Ok, dzięki jescze raz i sorki za ten źle napisany początek smile.gif
Piotrek05
A ja ostatnio tak sobie napisałem skrypt przeliczający liczbę z systemu dziesiętnego na binarny. Napisałem takim sposobem jaki pierwszy przyszedł mi do głowy. Pewnie dałoby się jakoś go uprościć ale u mnie wygląda tak:

  1. $liczba = (intval($_POST['liczba']));
  2. $pierw = (intval($_POST['liczba']));
  3. $reszty = array();
  4. if (is_int($liczba))
  5. {
  6. while($liczba > 0) {
  7. $liczba = floor($liczba / 2);
  8. $reszta = $liczba % 2;
  9. $reszty[] = $reszta;
  10. }
  11. $reszty = array_reverse($reszty);
  12. $reszty[] = 0;
  13. echo "Liczba " .$pierw. " zapisana w systemie binarnym to ";
  14. for($i = 1; $i < sizeof($reszty); $i++) {
  15. echo $reszty[$i];
  16. }
  17. }
  18. ?>
nospor
nie:
  1. $liczba = (intval($_POST['liczba']));
  2. $pierw = (intval($_POST['liczba']));

a:
  1. $pierw = $liczba = (intval($_POST['liczba']));


if (is_int($liczba))
Jesli dwie linijki wczesniej $liczba rzutujesz na INTa to trudno by nim nie był winksmiley.jpg
Crozin
btw: http://www.google.com/search?hl=en&cli...q=&gs_rfai= (nie wynajduj koła na nowo).
Pawel_W
Cytat(Crozin @ 21.09.2010, 22:19:38 ) *
btw: http://www.google.com/search?hl=en&cli...q=&gs_rfai= (nie wynajduj koła na nowo).

a tu post devnula z tematu "Quiz PHP"
  1. <?for($l=123;$l;$l>>=1)$b=($l%2).$b;echo$b;

wyświetli odpowiednik binarny dla 123 smile.gif

EDIT:
@Speedy
pisałem już o tym...
Speedy
Cytat(KeeL @ 21.09.2010, 18:00:02 ) *
Witam,

Czy posiada ktoś takowy algorytm, lub byłby tak miły mi napisać?

PS Pytałem wujka, ale nie dał mi odpowiedzi.

Z góry dziękuję i pozdrawiam KeeL


Jeśli ktoś nie wie o jakiego wujka chodzi to pisać na pw.


To następnym razem zapytaj ciocię. Ciocię Wikipedię.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.