gpt4 book ai didi

perl - 如何执行 64 位十六进制/十进制算术并将十六进制中的完整数字作为字符串在 Perl 中输出?

转载 作者:行者123 更新时间:2023-12-04 13:44:33 26 4
gpt4 key购买 nike

我需要对下面的大十六进制数进行一些算术运算,但是当我尝试输出时,我收到溢出错误消息“十六进制数 > 0xffffffff 不可移植”、有关不可移植的消息或最大 32 位十六进制值 FFFFFFFF。

所有这些都意味着标准语言和输出例程只能处理 32 位值。我需要 64 位值并进行了大量研究,但我发现没有任何东西可以同时启用算术和以十六进制输出大数。

my $result = 0x00000200A0000000 +
( ( $id & 0xFFFFF ) * 2 ) + ( ( $id / 0x100000 ) * 0x40000000 );

因此,对于具有以下值的 $id 我应该得到 $result :
$id = 0, $result = 0x00000200A0000000
$id = 1, $result = 0x00000200A0000002
$id = 2, $result = 0x00000200A0000004

我怎样才能做到这一点?

这是我不确定的研究结果,原因如下:
  • How can I do 64-bit arithmetic in Perl?
  • How can I sum large hexadecimal values in Perl?含糊不清,回答不明确,也没有例子。
  • Integer overflow
    非决定性
  • Integer overflow
    非决定性
  • bigint
    没有关于赋值、算术或输出的信息
  • bignum
    例子不接近我的问题。
  • How can I sprintf a big number in Perl?
    给出的示例对我来说信息不足:不处理十六进制
    赋值或算术。
  • Re: secret code generator
    一些使用 Fleximal 的例子,提到 to_str 输出值
    变量,但 1) 我不明白
    变量已分配,2)我得到
    错误“无法调用方法“to_str”
    没有包或对象
    引用”当我运行我的代码使用
    它。
  • String to Hex
    使用 Math::BigInt 的示例
    对我不起作用 - 仍然得到
    溢出错误。
  • Is there a 64-bit hex()?
    几乎在那里 - 但没有处理
    以十六进制输出大数,
    它只谈到十进制。
  • CPAN Math:Fleximal
    做算术,但实际上似乎没有任何方法
    输出仍为十六进制的值
  • sprintf
    似乎无法应付
    大于 32 位的数字,得到
    饱和的 FFFFFFFF 消息。


  • 编辑:更新 - 新要求和提供的解决方案 - 请随时提供评论

    查斯。 Owens 的回答仍然被接受并且非常好(第 2 部分对我有用,还没有尝试过更新 Perl 的第 1 部分版本,尽管我会邀请其他人确认)。

    但是,另一个要求是能够从结果转换回原始 ID。

    所以我写了代码来做到这一点,这是完整的解决方案,包括@Chas。 Owens 原始解决方案,随后针对此新要求实现:
    #!/usr/bin/perl

    use strict;
    use warnings;
    use bigint;

    use Carp;

    sub bighex {
    my $hex = shift;

    my $part = qr/[0-9a-fA-F]{8}/;
    croak "$hex is not a 64-bit hex number"
    unless my ($high, $low) = $hex =~ /^0x($part)($part)$/;

    return hex("0x$low") + (hex("0x$high") << 32);
    }

    sub to_bighex {
    my $decimal = shift;
    croak "$decimal is not an unsigned integer"
    unless $decimal =~ /^[0-9]+$/;

    my $high = $decimal >> 32;
    my $low = $decimal & 0xFFFFFFFF;

    return sprintf("%08x%08x", $high, $low);
    }

    for my $id (0 ,1, 2, 0xFFFFF, 0x100000, 0x100001, 0x1FFFFF, 0x200000, 0x7FDFFFFF ) {
    my $result = bighex("0x00000200A0000000");
    $result += ( ( $id & 0xFFFFF ) * 2 ) + ( ( $id / 0x100000 ) * 0x40000000 );

    my $clusterid = to_bighex($result);

    # the convert back code here:
    my $clusterid_asHex = bighex("0x".$clusterid);
    my $offset = $clusterid_asHex - bighex("0x00000200A0000000");
    my $index_small_units = ( $offset / 2 ) & 0xFFFFF;
    my $index_0x100000_units = ( $offset / 0x40000000 ) * 0x100000;
    my $index = $index_0x100000_units + $index_small_units;


    print "\$id = ".to_bighex( $id ).
    " clusterid = ".$clusterid.
    " back to \$id = ".to_bighex( $index ).
    " \n";
    }

    http://ideone.com/IMsp6 试试这个代码.

    最佳答案

    #!/usr/bin/perl

    use strict;
    use warnings;

    use bigint qw/hex/;

    for my $id (0 ,1, 2) {
    my $result = hex("0x00000200A0000000") +
    ( ( $id & 0xFFFFF ) * 2 ) + ( ( $id / 0x100000 ) * 0x40000000 );
    printf "%d: %#016x\n", $id, $result;
    }

    bigint pragma 替换了 hex 函数的版本可以处理这么大的数字。它还透明地使数学运算符处理大整数而不是目标平台上的整数。

    请注意,这仅适用于 Perl 5.10 及更高版本。如果你运行的是 Perl 5 的早期版本,你可以试试这个:
    #!/usr/bin/perl

    use strict;
    use warnings;
    use bigint;

    use Carp;

    sub bighex {
    my $hex = shift;

    my $part = qr/[0-9a-fA-F]{8}/;
    croak "$hex is not a 64-bit hex number"
    unless my ($high, $low) = $hex =~ /^0x($part)($part)$/;

    return hex("0x$low") + (hex("0x$high") << 32);
    }

    sub to_bighex {
    my $decimal = shift;
    croak "$decimal is not an unsigned integer"
    unless $decimal =~ /^[0-9]+$/;

    my $high = $decimal >> 32;
    my $low = $decimal & 0xFFFFFFFF;

    return sprintf("%08x%08x", $high, $low);
    }

    for my $id (0 ,1, 2) {
    my $result = bighex("0x00000200A0000000");
    $result += ( ( $id & 0xFFFFF ) * 2 ) + ( ( $id / 0x100000 ) * 0x40000000 );
    print "$id ", to_bighex($result), "\n";
    }

    关于perl - 如何执行 64 位十六进制/十进制算术并将十六进制中的完整数字作为字符串在 Perl 中输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3874197/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com