2024 年 PHP Conference Japan

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) 的用法範例:

// 來自 The IT Crowd 的有趣緊急號碼
// (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
函式 gmp_shiftl($x,$n) { // 左移
return(gmp_mul($x,gmp_pow(2,$n)));
}

函式
gmp_shiftr($x,$n) { // 右移
return(gmp_div($x,gmp_pow(2,$n)));
}
?>

祝您使用愉快,
Nitrogen.
richard-slater.co.uk
20 年前
對於那些(像我一樣)嘗試對非常大的數字進行位元遮罩的人來說,這裡有一個有用的函式可以幫您完成這項工作。

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