Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: (10) -> (2) i odwrotnie
Forum PHP.pl > Forum > PHP
batman
Witam. Nie pisałem dawnom, ponieważ roboty dużo, a czasu mało smile.gif Teraz mam mniej roboty, bo napotkałem przeszkodę.

Do rzeczy. Jak zamieniać liczby z systemu dziesiętnego na dwójkowy i odwrotnie? liczbami tymi są ułamki dziesiętne, więc decbin i bindec nie działa. Nie da się też zamienić osobno liczby całkowitej a potem ułamka, bo bzdury wychodzą. Czy jakaś funkcja, która to zrobi, czy musze pisać skrypt?
DeyV
  1. <?php
  2.  
  3. echo base_convert ( 123.12, 10, 2 );
  4.  
  5. ?>
batman
DeyV: niestety nie działa. Dla 2.1 i dla 21 daje taki sam wynik - 10101. Dzięki za zainteresowanie.

Już sobie poradziłem. Nie jest to eleganckie, ale działa winksmiley.jpg

  1. <?php
  2.  
  3. $aWynikbin=array();
  4.  
  5. //zamiana na system dwojkowy
  6. $aLiczba=explode('.',"0.6458");
  7.  
  8. while($aLiczba[1]!=0)
  9. {
  10. $ulamek="0.".$aLiczba[1];
  11. $wynik=$ulamek*2;
  12.  
  13. $wynik=(float)$wynik;
  14.  
  15. $aWynik=explode('.',$wynik);
  16.  
  17. if($wynik>=1)
  18. {
  19. $aWynikbin[]=1;
  20. }
  21. else
  22. {
  23. $aWynikbin[]=0;
  24. }
  25. $aLiczba=explode('.',$wynik);
  26.  
  27. if(count($aWynikbin)>10)
  28. {
  29. break;
  30. }
  31. }
  32.  
  33. $wynikbin=implode('',$aWynikbin);
  34. echo $wynikbin.'<br /><br /><br />';
  35.  
  36. //zamiana na system dziesietny
  37. $liczba="010";
  38.  
  39. for($i=0;$i<strlen($liczba);$i++)
  40. {
  41. $wykladnik=$i+1;
  42. $element=substr($liczba,$i,1)*pow(2,-$wykladnik);
  43. $wynikdec=$wynikdec+$element;
  44.  
  45. }
  46. echo $wynikdec;
  47.  
  48. ?>
mike
Cytat(shpyo @ 2005-10-23 14:55:30)

Piotruś czytaj dokładniej tongue.gif
Cytat(batman @ 2005-10-19 18:26:10)
(...) liczbami tymi są ułamki dziesiętne, więc decbin i bindec nie działa. (...)
dr_bonzo
  1. <?php
  2. /**
  3.  * Konwertuje libczbe zmiennoprzeinkowa DEC -> BIN 
  4.  * 
  5.  * @param $floatNumber float liczba ktora konwertujemy
  6.  * @param $intPrecision integer 
  7.  * @param $boolTrim boolean obcinac koncowe zera czy nie)
  8.  * @return float liczba skonwertowana do syst buinarnego
  9.  */
  10. function floatDecToBin( $floatNumber, $intPrecision, $boolTrim )
  11. {
  12. $intDestBase = 2;
  13. $arrNumberParts = explode( '.', strval( $floatNumber ) );
  14.  
  15. // czesc calkowita
  16. $strIntegerPartBin = decbin( $arrNumberParts[ 0 ] );
  17.  
  18. // czesc ulamkowa
  19. $strFractionPartBin = '';
  20. $temp = 0;
  21. $fraction = floatval( '.' . $arrNumberParts[ 1 ] ); // skonwertuj czesc ulamkowa (bez kropki) do ulamka
  22. for ( $i = 0; $i < $intPrecision; $i++ )
  23. {
  24. $fraction *= $intDestBase;
  25. $fl = floor( $fraction ); 
  26. $strFractionPartBin .= $fl;// dopisz kolejna cyfre (wartosc calkowita iloczynu)
  27. $fraction -= $fl; // 'odetnij' czesc calkowita
  28. }
  29.  
  30. $value = $strIntegerPartBin . '.' . $strFractionPartBin;
  31.  
  32. return ( $boolTrim ) ? floatval( rtrim( $value, '0' ) ) : floatval( $value );
  33. }
  34.  
  35.  
  36. print( floatDecToBin( '12.625', 6, TRUE ) . "n" ); // 101.101 (b)
  37. print( floatDecToBin( '12.625', 6, FALSE ) . "n" ); // 101.101000 (b)
  38. print( floatDecToBin( '12.625', 1, FALSE ) . "n" ); // 101.1 (b)
  39. ?>


Pozniej moze dorobie funkcje ogolne, dla dowolnych baz, w obu kierunkach.
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.