PHP中任意大整数的算术运算
好的,考虑到PHP仅本地支持32位带符号整数,因此它并不是处理任意大整数的最佳语言。我要尝试做的是创建一个类,该类可以表示任意大的二进制数,并且能够对其中的两个(加/减/乘/除)进行简单的算术运算。
我的目标是处理128位整数。
我正在寻找几种方法,以及它们遇到的问题。任何关于我们选择什么以及如何进行的输入或者评论将不胜感激。
方法1:创建一个128位整数类,将其整数内部存储为四个32位整数。这种方法的唯一问题是,在处理两个操作数的各个块时,我不确定如何处理上溢/下溢问题。
方法2:使用bcmath扩展名,因为这看起来像是它要解决的问题。我唯一担心的是bcmath扩展的比例设置,因为我的128位整数中没有任何舍入错误;他们必须精确。我还担心最终能否将bcmath函数的结果转换为二进制字符串(稍后需要将其转换为某些mcrypt加密函数)。
方法3:将数字存储为二进制字符串(可能优先为LSB)。从理论上讲,我应该能够以这种方式存储任意大小的整数。我要做的就是编写四个基本的算术函数,对两个二进制字符串执行add / sub / mult / div,并产生一个二进制字符串结果。这正是我也需要移交给mcrypt的格式,所以这是一个额外的优点。我认为这是目前最有前途的方法,但是我遇到的一个棘手问题是,PHP没有提供任何方式来操纵单个位(我知道)。我相信我必须将其分解为字节大小的块(没有双关语),这时我对处理方法1中的上溢/下溢的问题适用。
解决方案
回答
已经有各种可用的类,因此我们不妨在编写自己的解决方案之前先仔细研究一下它们(如果确实需要编写自己的解决方案)。
回答
据我所知,bcmath扩展名是我们想要的扩展名。 PHP手册中的数据有些稀疏,但是我们可以使用bcscale()函数或者大多数其他bcmath函数中的可选第三个参数来将精度设置为恰好需要的精度。对二进制字符串的事情不太确定,但是有些谷歌搜索告诉我我们应该可以通过使用pack()函数来进行处理。
回答
PHP GMP扩展将对此更好。另外,我们可以使用它来进行十进制到二进制的转换,如下所示:
gmp_strval(gmp_init($n, 10), 2);