2024年PHP开发者大会日本站

GMP 函数

参见

更多数学函数可以在数学扩展章节中找到。

目录

添加笔记

用户贡献笔记 2 条笔记

Nitrogen
14年前
我编写了一个函数,可以用于将数字转换为任意进制。它不会返回预定义字符索引的字符串(例如 0-9a-z),而是返回索引数组,您可以使用它创建任意长度的自定义字符集。
我四处查找了一下,没有看到其他人编写过类似的函数。我需要这个函数用于一个简单的仅使用数字的压缩算法,虽然我还没有真正实现它,但这只是一个初步的想法。

<?php
// ConvertBase 函数详解:
// 我们添加一个数组项 $Input%$Base 向下取整,并将 $Input 除以 $Base 向下取整。
// 重复此过程,直到 $Input 不再大于 0。

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);
}

// gmp_strval($.., 36); 的示例实现:

// 来自《IT狂人》中的搞笑紧急号码
// (gmp_init 不喜欢前导零)
$Input = '1189998819991197253';

// gmp_strval($.., 36); 中使用的 36 个字符示例
$Chars = '0123456789abcdefghijklmnopqrstuvwxyz';

// 统计 $Chars 的数量,以便使用所有字符
// 或使用小于 $Chars 长度的自定义数字
$Base = strlen($Chars);

// 执行
$Result = ConvertBase($Input,$Base);

// 将生成的索引替换为 $Chars 中对应索引的字符
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));

/* 输出:
gmp_strval: 91h7dixfq6h1
BaseConvert: 91h7dixfq6h1
*/
?>
当然,这个例子显示了一个熟悉的结果,但是这个函数的目的是让你可以使用任何你想要的进制,并显示你自己的输出以表示任何你选择的数字。

此外,对于那些希望进行按位移位操作的人来说,这非常简单……左移只需将数字乘以 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)));
}
?>

玩的开心!
氮气。
richard-slater.co.uk
20年前
对于那些(像我一样)试图对非常大的数字进行位掩码操作的人来说,这里有一个有用的函数可以帮助你完成这项工作。

<?php
function isBitSet($bitMask, $bitMap)
{
return (bool)
gmp_intval(gmp_div(gmp_and($bitMask, $bitMap),$bitMask));
}
?>
To Top