【问题标题】:How do I convert decimal numbers to binary in Perl?如何在 Perl 中将十进制数字转换为二进制?
【发布时间】:2011-02-18 18:16:47
【问题描述】:

我正在尝试在 Perl 中制作一个将十进制数或文本转换为二进制数的程序。该程序要求用户输入字符或字符串,然后将结果打印到控制台。我该怎么做呢?我一直在处理的代码如下,但我似乎无法修复它。

print "Enter a number to convert: ";
chomp($decimal = <STDIN>);
print "\nConverting $number to binary...\n";
$remainder = $decimal%2;
while($decimal > 0)
{
    $decimal/2;
    print $remainder;
}

【问题讨论】:

    标签: perl algorithm binary decimal


    【解决方案1】:

    我的 .bash_profile 中有这些别名,以便在命令行上快速转换:

    # from-decimal
    alias d2h="perl -e 'printf qq|%X\n|, int( shift )'"
    alias d2o="perl -e 'printf qq|%o\n|, int( shift )'"
    alias d2b="perl -e 'printf qq|%b\n|, int( shift )'"
    # from-hex
    alias h2d="perl -e 'printf qq|%d\n|, hex( shift )'"
    alias h2o="perl -e 'printf qq|%o\n|, hex( shift )'"
    alias h2b="perl -e 'printf qq|%b\n|, hex( shift )'"
    # from-octal
    alias o2h="perl -e 'printf qq|%X\n|, oct( shift )'"
    alias o2d="perl -e 'printf qq|%d\n|, oct( shift )'"
    alias o2b="perl -e 'printf qq|%b\n|, oct( shift )'"
    # from-binary
    alias b2h="perl -e 'printf qq|%X\n|, oct( q|0b| . shift )'"
    alias b2d="perl -e 'printf qq|%d\n|, oct( q|0b| . shift )'"
    alias b2o="perl -e 'printf qq|%o\n|, oct( q|0b| . shift )'"
    

    【讨论】:

    • 为什么省略了二进制 (b2_) 转换?我相信以下内容符合您的约定:alias b2h="perl -e 'printf qq|%X\n|, oct( q|0b| . shift )'"alias b2d="perl -e 'printf qq|%d\n|, oct( q|0b| . shift )'"alias b2o="perl -e 'printf qq|%o\n|, oct( q|0b| . shift )'"。但顺便说一句,如果使用 bash,转十进制 (_2d) 转换更便宜且更易于使用内置扩展,例如echo $((16#F)) $((2#111))F 解释为十六进制,111 解释为二进制。输出十进制 157
    • @ardnew 除了我不使用它们之外,没有理由省略任何内容。你会找到,如果你想编辑答案来添加它们,我没问题。
    【解决方案2】:

    我使用此代码将十进制转换为二进制,希望对您有所帮助:

    print "Enter a number to convert: ";
    chomp($decimal = <STDIN>);
    print "\nConverting $number to binary...\n";
    $ans=0;$i=1;
    while($decimal > 0)
    {
        $remainder = $decimal%2;
        $ans=$ans+$remainder*$i;
        $i=$i*10;
        $decimal >>= 1
    }
    print $ans
    

    【讨论】:

      【解决方案3】:

      试试这个进行十进制到二进制的转换:

      my $bin = sprintf ("%b", $dec);
      

      获取每一位:

      my @bits = split(//, $bin);
      

      然后你可以操作每个位,改变 MSB 索引等等。

      【讨论】:

      • 对于前导零,比如总共 8 位数字,使用 my $bin = sprintf ("%.8b", $dec);。示例:00000001
      • 实际上,您可能想说my @bits = reverse split(//, $bin) 这样$bits[0] 最终成为LSB。
      【解决方案4】:

      请尝试以下代码。它会起作用的。

      #!/usr/bin/perl
      
      use strict;
      
      print "Enter a decimal number \n";
      
      my $dec_number = <STDIN>;
      chomp($dec_number);
      
      my $reminder;
      my $result;
      
      while ($dec_number >= 1)
      {
          $reminder = $dec_number % 2;       #Modulo division to get remainder
          $result = $reminder . $result;     #Concatenation of two numbers
          $dec_number = $dec_number / 2;     #New Value of decimal number to do next set of above operations
      }
      
      print "Binary number Output = ", $result, "\n";
      

      【讨论】:

        【解决方案5】:
        #!/usr/bin/perl
        use strict;
        print "Enter a number to convert: ";
        chomp(my $decimal = <STDIN>);
        
        print "\nConverting $decimal to binary...\n";
        
        my @array;
        my $num;
        
        while($decimal >= 1)
        {
            if($decimal == 1) {
        
                $num .= 1;
                last;
            }
        
            my $remainder = $decimal%2;
            $num .= $remainder;
            $decimal = $decimal/2;
        }
        
        print $num."\n";
        

        【讨论】:

          【解决方案6】:
          alias b2d="perl -e 'printf qq|%d\n|, unpack("N", pack("B32", substr("0" x 32 . 1101 , -32)))'"
          alias b2h="perl -e 'printf qq|%X\n|, unpack("N", pack("B32", substr("0" x 32 . 1101 , -32)))'"
          alias b2o="perl -e 'printf qq|%o\n|, unpack("N", pack("B32", substr("0" x 32 . 1101 , -32)))'"
          

          【讨论】:

            【解决方案7】:

            perlfaq4 中列出了几种将十进制转换为二进制的方法 (How do I convert between numeric representations/bases/radixes?)。

            sprintf 是个不错的选择。

            【讨论】:

              【解决方案8】:

              $decimal/2; 不影响$decimal

              你可能想要$decimal /= 2;,或者如果你想要很酷,那么$decimal &gt;&gt;= 1;

              但真的,真的,你可能只是想要:

              printf "%b\n", $decimal;

              【讨论】:

              • /= 是什么意思,printf 有什么作用?对不起,我对 perl 有点陌生
              • /= 是除法赋值,换句话说$decimal /= 2 等价于$decimal = $decimal / 2printf 是一个格式化打印函数。如果您对编程真的太陌生以至于对这些内容不熟悉,我强烈建议您购买一本关于 Perl 的书来开始使用,而不是仅仅依靠在 Internet 上提问。
              • '$decimal /= 2;'是 '$decimal = $decimal / 2;' 的简写像$decimal/2; 这样的行没有任何作用。就像42; printf 这样的行表示“打印格式”。 '%b' 表示参数在输出时将转换为二进制。
              • 另外,我运行了你给我的输入,它正确地转换了数字,但是,它不断地将答案无限打印到屏幕上。显然我的 while 循环的逻辑有问题,但我不明白它是什么。
              • @David 如果您使用了printf 行,则根本不需要循环。 printf 行完成了将数字转换为其二进制表示然后打印它的完整工作。一定要尝试找到有关 Perl 的介绍性文本。复制粘贴您并不真正理解的其他人的代码不会走得太远。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-04-28
              • 1970-01-01
              • 2014-11-07
              • 2011-02-17
              • 1970-01-01
              相关资源
              最近更新 更多