【问题标题】:How do I convert a binary string to a number in Perl?如何在 Perl 中将二进制字符串转换为数字?
【发布时间】:2010-10-03 18:37:28
【问题描述】:

如何在 Perl 中将二进制字符串 $x_bin="0001001100101" 转换为其数值 $x_num=613

【问题讨论】:

    标签: perl binary


    【解决方案1】:

    我的首选方式是:

    $x_num = oct("0b" . $x_bin);
    

    引用man perlfunc:

    十月 EXPR oct 将 EXPR 解释为八进制字符串并返回 对应的值。 (如果 EXPR 恰好启动 用“0x”关闭,将其解释为十六进制字符串。如果 EXPR 以“0b”开头,它被解释为 二进制字符串。前导空格被忽略 所有三种情况。)

    【讨论】:

    • @edg:这在 32 位平台上是可以预期的;对我有用 64 位,尽管有可移植性警告。
    • 我一直使用 pack,但我只是对 pack、oct 和 Bit::Vector 进行了基准测试,这是迄今为止三者中最快的。它比 Bit::Vector 快 1449%,比我系统上的 pack 快 316%。
    【解决方案2】:
    sub bin2dec {
        return unpack("N", pack("B32", substr("0" x 32 . shift, -32)));
    }
    

    【讨论】:

    • 我问的每个工具都告诉我 111111111111111111111111111111111 转换为 8589934591。你有多确定 42949672958589934591 是正确的?
    • 这也是由内置的 oct() 完成的,虽然它的名字很糟糕。
    【解决方案3】:

    像往常一样,这里还有一个优秀的 CPAN 模块应该在这里提到:Bit::Vector

    转换看起来像这样:

    use Bit::Vector;
    
    my $v = Bit::Vector->new_Bin( 32, '0001001100101' );
    print "hex: ", $v->to_Hex(), "\n";
    print "dec: ", $v->to_Dec(), "\n";
    

    二进制字符串几乎可以是任意长度,您还可以执行其他简洁的操作,例如位移等。

    【讨论】:

      【解决方案4】:

      其实你可以把'0b'贴在前面,它被当作二进制数处理。

      perl -le 'print 0b101'
      5
      

      但这仅适用于裸词。

      【讨论】:

        【解决方案5】:

        您可以使用eval() 方法来解决裸字限制:

        eval "\$num=0b$str;";
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-16
          • 1970-01-01
          • 1970-01-01
          • 2010-12-04
          • 1970-01-01
          • 2011-02-18
          • 2016-01-14
          相关资源
          最近更新 更多