Omrekenen van getallenstelsels

Uit Bizzieman / PHP Wiki
Ga naar: navigatie, zoeken
Toelichting
Met deze code kun je getallen van het ene getallenstelsel omzetten naar een willekeurig ander getallenstelsel. De te gebruiken stelsels zijn vanaf 2-tallig (binair) tot en met het 62-tallig stelsel.

Snippets

<?php
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);

// hulpfunction voor het omzetten van een getal uit een willekeurig
// stelsel naar het 10-tallig stelsel
function naardecimal($getal, $vanstelsel)
{
	if($vanstelsel > 62 or $vanstelsel < 2) return 'Error';
	$chars = array_merge(range('0','9'),range('A','Z'),range('a','z'));
	$decimal = 0;
	$getal = (string)$getal;
	$bool = false;
	for($i=0; $i<strlen($getal); $i++)
	{
		$search = (ord($getal[$i]) < 64) ? ord($getal[$i])-48 : $getal[$i];
		$decimal += pow($vanstelsel, strlen($getal)-$i-1) * array_search($search, $chars, true);
		$bool = ($bool or (array_search($search, $chars, true) >= $vanstelsel));
	}
	return ($bool) ? 'Error' : $decimal;
}

// hulpfunction voor het omzetten van een getal uit het 10-tallig stelsel
// naar een willekeurig ander stelsel
function naarnieuwewaarde($getal, $naarstelsel, $return = '')
{
	if($naarstelsel > 62 or $naarstelsel < 2) return 'Error';
	$chars = array_merge(range('0','9'),range('A','Z'),range('a','z'));
	if($getal > $naarstelsel-1)
	{
		$return .= naarnieuwewaarde(floor($getal / $naarstelsel), $naarstelsel, $return);
	}
	$return .= $chars[($getal) % $naarstelsel];
	return $return;
}

// deze function rekent een getal uit een willekeurig stelsel om naar een
// ander willekeurig stelsel
function omrekenen($getal, $vanstelsel, $naarstelsel)
{
	if($vanstelsel > 62 or $vanstelsel < 2 or $naarstelsel > 62 or $naarstelsel < 2) return 'Error';
	$decimal = naardecimal($getal, $vanstelsel);
	return ($decimal == 'Error') ? 'Error' : naarnieuwewaarde($decimal, $naarstelsel, $return = '');
}

// de aanroep wordt op de volgende manier gedaan:
// omrekenen(het_om_te_rekenen_getal, het_huidige_stelsel, het_gewenste_stelsel)
// voorbeelden van de aanroep
echo 		omrekenen(25, 10, 8) . '<br />';	// geeft 31 (8-tallig stelsel)
$var 	= 	omrekenen('F0', 16, 2) . '<br />';	// geeft 11110000 (2-tallig stelsel)
echo 		omrekenen(11110000, 2, 20) . '<br />';	// geeft C0 (20-tallig stelsel)
$getal 	= 	omrekenen(213, 5, 4) . '<br />';	// geeft 322 (4-tallig stelsel)
?>

Snippets