我编写了一个函数,可以用于将数字转换为任意进制。它不会返回预定义字符索引的字符串(例如 0-9a-z),而是返回索引数组,您可以使用它创建任意长度的自定义字符集。
我四处查找了一下,没有看到其他人编写过类似的函数。我需要这个函数用于一个简单的仅使用数字的压缩算法,虽然我还没有真正实现它,但这只是一个初步的想法。
<?php
function ConvertBase($Input,$Base=10) {
$Input=gmp_init($Input);
$Result=array();
for($i=0;$i<1||gmp_sign($Input)==1;$i++) {
$Result[]=gmp_intval(gmp_mod($Input,$Base));
$Input=gmp_div_q($Input,$Base);
}
$Result=array_reverse($Result);
return($Result);
}
$Input = '1189998819991197253';
$Chars = '0123456789abcdefghijklmnopqrstuvwxyz';
$Base = strlen($Chars);
$Result = ConvertBase($Input,$Base);
for($i=0;$i<count($Result);$i++)
$Result[$i]=$Chars{$Result[$i]};
printf("gmp_strval: %s\r\n",gmp_strval($Input,36));
printf("BaseConvert: %s\r\n",implode($Result));
?>
当然,这个例子显示了一个熟悉的结果,但是这个函数的目的是让你可以使用任何你想要的进制,并显示你自己的输出以表示任何你选择的数字。
此外,对于那些希望进行按位移位操作的人来说,这非常简单……左移只需将数字乘以 pow(2,x),右移只需除以 pow(2,x)。
<?php
function gmp_shiftl($x,$n) { return(gmp_mul($x,gmp_pow(2,$n)));
}
function gmp_shiftr($x,$n) { return(gmp_div($x,gmp_pow(2,$n)));
}
?>
玩的开心!
氮气。