Autor Zpráva
Senky
Profil
Zdravím,
pokúšal som sa napísať si vlastnú funkciu, ktorá by prevádzala čísla z desatinnej do dvojkovej sústavy v php. Tu je kód:

$number = $_GET['n'];
$zvysok = array();

do_calculation($number);

function do_calculation($number)
{
	global $zvysok;

	$zvysok[] = $number%2;
	if($number%2)
	{
		$number = ($number-1)/2;
	}
	else
	{
		$number = $number/2;
	}

	if($number)
	{
		do_calculation($number);
	}
	else
	{
		$i = count($zvysok)-1;
		while($i >= 0)
		{
			echo $zvysok[$i];
			$i--;
		}
	}
}


Všetko vyzeralo, že funguje. Zadal som 1 a výsledok bol 1, pri 2 bol výsledok 10, atď. Avšak pri väčších číslach to má problém, a netuším prečo, keďže to je veľmi jednoduchá funkcia. Také

99999999999999 = 101101011110011000100000111101000-1-11-11-1-1-1-111-1-11

a netuším, ako sa tam môžu zobrať tie pomĺčky a pod.

Vedeli by ste mi pomôcť, alebo aspoň povedať, prečo to tak je?

Ďakujem.
Spectator
Profil
Zkoušel jsem tvoje devítky i moje číslo 650000111199999999995345345345345345345345345364534593463419999977777774524543453 a fngovalo to stále OK.
Byl ovšem rozdíl v tom, že jsem si $_GET['n'] nahradil přímo tím číslem, které jsem chtěl, takž etam hude možná zakopaný pes


EDIT:
Dal jsem tam i ten get a i s nim mi to fungovalo na vysoká čísla
YoSarin
Profil
Senky:
nejsou ty pomlčky náhodou -1? Co vypíše
echo PHP_INT_MAX;
?
Majkl578
Profil
Maximální velikost čísla závisí na jádře systému. Na 32-bitových systémech to bude kolem dvou milionů, na 64-bitových systémech kolem 9e18. Popsané to je v dokumentaci.

Vlastní implementace jde napsat mnohem snáž:
$n = 123456;

echo decbin($n); //referenční hodnota
echo '<br>';

$decbinX = function ($n) {
    $b = '';
    for ($i = floor(log($n, 2)); $i >= 0; $i--) {
        $b .= ($n & pow(2, $i)) ? '1' : '0';
    }
    return $b;
};

echo $decbinX($n);

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0