PHP中任意大整数的算法

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (108)

好的,因此PHP不是处理任意大整数的最佳语言,因为它本身只支持32位有符号整数。我正在尝试做的是创建一个可以表示任意大二进制数的类,并且能够对其中两个执行简单的算术运算(加/减/乘/除)。

我的目标是处理128位整数。

我正在看几种方法,以及我看到的问题。任何关于您将选择什么以及如何进行评论的输入或评论将不胜感激。

方法#1:创建一个128位整数类,在内部将整数存储为四个32位整数。这种方法的唯一问题是,我不确定在操作两个操作数的各个块时如何处理溢出/下溢问题。

方法#2:使用bcmath扩展,因为它看起来像它旨在解决的问题。我唯一担心采用这种方法是bcmath扩展的比例设置,因为我的128位整数中不会有任何舍入错误; 他们必须准确。我还担心能够最终将bcmath函数的结果转换为二进制字符串(我稍后需要将其转换为某些mcrypt加密函数)。

方法#3:将数字存储为二进制字符串(可能是LSB优先)。从理论上讲,我应该能够以这种方式存储任意大小的整数。我所要做的就是编写四个基本算术函数,对两个二进制字符串执行add / sub / mult / div并生成二进制字符串结果。这正是我需要交给mcrypt的格式,所以这是一个额外的加号。这是我认为目前最有希望的方法,但我得到的一个问题是PHP没有提供任何方法来操纵各个位(我知道)。我相信我必须把它分解成字节大小的块(没有双关语意),此时我对方法#1处理溢出/下溢的问题适用。

提问于
用户回答回答于

PHP扩展GMP将是这更好的。作为额外的奖励,您可以使用它来进行十进制到二进制转换,如下所示:

gmp_strval(gmp_init($n, 10), 2);
用户回答回答于

据我所知,bcmath扩展是你想要的扩展。PHP手册中的数据有点稀疏,但您可以通过使用bcscale()函数或大多数其他bcmath函数中的可选第三个参数来将精度设置为您所需的精度。不太确定二进制字符串的东西,但是一些谷歌搜索告诉我你应该能够通过使用pack()函数来做到这一点。

扫码关注云+社区

领取腾讯云代金券