Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: z dzięsiętnej na binarną alternatywnie
Forum PHP.pl > Forum > PHP
onlyX
Staram się zrobić graficzną interpretację dwójkową ciagu Fibbonacciego, tak jak jest pokazane na tej stronie: http://pl.wikipedia.org/wiki/Ci%C4%85g_Fib...a_dw.C3.B3jkowa

Tylko natrafiłem na dosyc powazny problem. php ma kłopot z konwersją dużych liczb dziesiętnych na binarne. Efekt: http://www.understyle.linuxpl.com/php_test/fibonacci.php

Cały kod wygląda tak:
  1. <?php
  2. $fib = array();
  3.  
  4. for($i=0; $i<150; $i++) {
  5. if ($i==0) {
  6. $fib[]=0;
  7. }
  8. else if ($i==1) {
  9. $fib[]=1;
  10. }
  11. else {
  12. $fib[]=bcadd($fib[$i-1], $fib[$i-2]);
  13. }
  14. }
  15.  
  16. echo '<p style=\"width:150px; text-align:right; line-height:1px\">';
  17.  
  18. for($i=0; $i<count($fib); $i++) {
  19. $txt = base_convert($fib[$i],10,2);
  20. // $txt = decbin($fib[$i]);
  21. $txt = str_replace(&#092;"0\", '<img src=\"w.gif\" />', $txt);
  22. $txt = str_replace(&#092;"1\", '<img src=\"b.gif\" />', $txt);
  23. echo $txt .&#092;"<br />\";
  24. }
  25. echo &#092;"</p>\";
  26.  
  27. ?>


Czy istnieje jakaś inna metoda zamiany liczb dzięsiętnych na binarne?

Próbowałem zamiast:
Kod
base_convert(int,10,2)

użyć:
Kod
decbin(int)

ale ta funkcja okazała się jeszcze słabsza.
hwao
Napisz sobie sam funkcje ktora zkonwertuje dowolna liczbe dziesietna do dwujkowej w sumie to bedzie okolo 3 linijki + petla (while)
zwroci to jako string wiec problemu nie powino byc smile.gif
onlyX
Napisałem funkcję, ale brakuje w wyniku zawsze jednej cyfry i nie wiem jak odwrócić kolejność znaków w stringu.

  1. <?php
  2.  
  3. function dec2bin($dec) {
  4. $bin = &#092;"\";
  5. while($dec>=2){
  6. $dec = floor($dec/2);
  7. $bin = $bin . ($dec%2);
  8. }
  9. return $bin;
  10. }
  11.  
  12. ?>

Nie wiem jak sobie z tym poradzić.
Na koniec trzeba pewnie będzie jeszcze zamienić dzielenie Modulo na bcmod().
Radarek
  1. <?php
  2.  
  3. function dec2bin($dec) {
  4. $bin = &#092;"\";
  5. while($dec>0){
  6. $bin = ($dec % 2) . $bin;
  7. $dec = floor($dec/2);
  8. }
  9. return $bin;
  10. }
  11. ?>
onlyX
Dzięki Radarek. Funkcja działa poprawnie, ale tylko do pewnego momentu. Przy większych liczbach ma ju kłopoty. Zamieniłem wszystkie działania na ich odpowiedniki w BCMath, ale to niewiele dało:

  1. <?php
  2. function dec2bin($dec) {
  3. $bin = &#092;"\";
  4. while(bccomp($dec, 0)==1) {
  5. $bin = bcmod($dec, 2) . $bin;
  6. $dec = floor(bcdiv($dec, 2));
  7. }
  8. return $bin;
  9. }
  10. ?>
Radarek
Hm.. chyba chodzi o funkcje floor -> ona nie obsluguje duzych liczb.

Sprobuj ustawic precyzje dzialan na 0 za pomoca funkcji
bscale (http://pl.php.net/manual/pl/function.bcscale.php) i normalnie dzielic na 2 bez zaokraglania.
onlyX
Radarek, jesteś wielki! biggrin.gif
Wszystko śmiga pięknie. Teraz mogę wygenerować ile chcem wyrazów ciągu.
Nie trzeba było nawet korzystac z funkcji bcscale, wystarczyło dodać treci parametr do bcdiv:
  1. <?php
  2. function dec2bin($dec) {
  3. $bin = &#092;"\";
  4. while(bccomp($dec, 0)==1) {
  5. $bin = bcmod($dec, 2) . $bin;
  6. $dec = bcdiv($dec, 2, 0);
  7. }
  8. return $bin;
  9. }
  10. ?>

Jedynym problemem jest teraz wydajnośc mojego FireFoxa. smile.gif
Ma problem z wyświetleniem tylu GIFów na raz.

Trzebaby było wszystko pokazać w jenym obrazku, ale na tym ję już wogóle nie znam.
kszychu
Cytat(onlyX @ 2005-06-02 12:54:44)
Trzebaby było wszystko pokazać w jenym obrazku, ale na tym ję już wogóle nie znam.

Spróbuj użyć do tego gd.
onlyX
Wiem jakiej biblioteki trzeba użyć. Ale nie znam się na jej obsłudze.
Wymyśliłem, żeby zamiast GIFów uzyć tekstu z odpowiednim stylem:
  1. <?php
  2. // (...)
  3. echo '<pre style=\"text-align:right; font-weight:bold; line-height:1px; font-size:1px\">';
  4. for($i=0; $i<count($fib); $i++) {
  5. $txt = dec2bin($fib[$i]); //konwersja z dziesietnej na binarna
  6. $txt = str_replace(&#092;"0\", ' ', $txt); //w zastepstwie bialego GIFa
  7. $txt = str_replace(&#092;"1\", '8', $txt); // //w zastepstwie czarnego GIFa
  8. //$txt = str_replace(\"0\", '<img src=\"w.gif\" />', $txt);
  9. //$txt = str_replace(\"1\", '<img src=\"b.gif\" />', $txt);
  10. echo $txt .&#092;"<br />\";
  11. }
  12. echo &#092;"</pre>\";
  13.  
  14. ?>

Różnica jest prawie niezauważalna, a skrypt mocno zyskuje na wydajności.
dr_bonzo
Cytat
Ale nie znam się na jej obsłudze.
To jest dobra okazja zeby sie nauczyc, kiedys ci sie przyda smile.gif
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.