【问题标题】:How can I do 64-bit arithmetic in Perl?如何在 Perl 中进行 64 位运算?
【发布时间】:2023-03-25 15:06:02
【问题描述】:

我是 perl 新手,

我可以在 Perl 中简单地使用 64 位算术吗?

例如

$operand1 = 0xFFFFFFFFFFFF;   # 48 bit value
$operand2 = 0xFFFFFFFFFFFF;   # 48 bit value

$Result = $operand1 * $operand2;
  • 我基本上是在找一个 替换 perl 中的 int64_t。
  • 有什么办法可以提一下,如果 变量是有符号还是无符号?

【问题讨论】:

  • 您真的想要 64 位算术还是大数?你想让它在 64 位后溢出吗?

标签: perl 64-bit signed


【解决方案1】:

是的,但是您需要使用 64 位支持编译 Perl。

【讨论】:

  • "use bigint" 将确保它始终有效。 (如果你想要绝对速度,那你就选错了编程语言。)
  • Perl 常用于生物信息学和其他需要高性能的领域。如果您的数字肯定适合 64 位,那么这个答案将创建性能更好的代码。只要确保使用最新版本的 Perl,您可能想自己编译它。 “现在认为 64 位支持已经成熟”dev.perl.org/perl5/news/2002/07/18/580ann
  • 即使支持 64 位,您也需要 use integer; 以避免获得(舍入)浮点结果,而是获得(高位截断)整数结果。
【解决方案2】:

bigint:

对 Perl 的透明 BigInteger 支持...

除范围运算符.. 之外的所有运算符(包括基本数学运算)都被重载。整数常量被创建为适当的 BigInts。

浮点常量被截断为整数。表达式的所有部分和结果也会被截断。

integer 不同,此编译指示创建的整数常量仅受可用内存和 CPU 时间的限制...

【讨论】:

  • +1 谢谢,但是我不能使用像 hex() 之类的函数~~~
  • Alphaneo,其实你可以做到$a = Math::BigInt->new("0x".$your_int)$a->as_hex()
【解决方案3】:

是的,Perl 会自动为您处理大整数运算。但是,Perl 没有区分有符号和无符号类型(没有必要,因为大整数范围没有固定界限)。

perlnumber 手册页包含有关 Perl 支持的不同数字格式的更多信息。

【讨论】:

  • 不清楚您所说的“有符号值和无符号值之间的区别”是什么意思?
  • 对,我应该说“类型”而不是“值”。固定。
【解决方案4】:

请注意,Perl 中的 64 位算术是第一位的,但 sprintf %d %u 和 %s 显示的是第二位。 当前perl版本支持64bits没有问题,但是sprintf %d格式不支持,%b同样。

【讨论】:

    【解决方案5】:

    use bigint 将使 Perl 正确处理任意大小的整数而不会溢出。

    例如:

    use bigint;
    print 1 << 256;
    

    将打印:

    115792089237316195423570985008687907853269984665640564039457584007913129639936
    

    【讨论】:

      猜你喜欢
      • 2014-07-25
      • 2021-09-23
      • 2015-07-16
      • 2016-01-17
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      • 2015-08-07
      • 1970-01-01
      相关资源
      最近更新 更多