【问题标题】:Treat string as binary and do binary manipulation in perl将字符串视为二进制并在 perl 中进行二进制操作
【发布时间】:2012-05-07 17:31:02
【问题描述】:

假设我在 perl 中有两个字符串

$a = "10001";
$b = "10101";

我需要找到这两个字符串的按位异或,即

$a XOR $b = "00100";

我应该如何在 perl 中做到这一点?

【问题讨论】:

    标签: string perl binary bit-manipulation


    【解决方案1】:

    xor two numbers

    my $n1 = 0b10001;
    my $n2 = 0b10101;
    my $n = $n1 ^ $n2;
    say sprintf '%05b', $n;
    

    异或两个数字(从字符串形式开始):

    my $n1 = '10001';
    my $n2 = '10101';
    my $len = max map length, $n1, $n2;
    my $n = oct("0b$n1") ^ oct("0b$n2");
    say sprintf '%0*b', $len, $n;
    

    xor two strings:(任意长度,只要两个字符串相同):

    my $n1 = '10001';
    my $n2 = '10101';
    my $n = ($n1 ^ $n2) | ("\x30" x length($n1));
    say $n;
    

    异或两个字符串:(任意长度):

    my $n1 = '010001';
    my $n2 = '10101';
    my $len = max map length, $n1, $n2;
    $n1 = substr((" " x $len).$n1, -$len);
    $n2 = substr((" " x $len).$n2, -$len);
    my $n = ($n1 ^ $n2) | ("\x30" x $len);
    say $n;
    

    【讨论】:

      【解决方案2】:

      使用oct:

      如果 EXPR 以 0b 开头,则将其解释为二进制字符串。

      #!/usr/bin/env perl
      
      my ($x, $y) = map oct "0b$_", qw(10001 10101);
      printf "%08b\n", $x ^ $y;
      

      【讨论】:

        【解决方案3】:

        如果你自己声明信息,你可以使用一点字面量:

        my $first = 0b10001;
        my $second = 0b10101;
        
        my $xored = $first ^ $second;
        
        if ($xored == 0b00100)
        {
            print "Good!";
        }
        

        也适用于数字和十六进制:

        my $first = 21;    # or 0b10101 or 0x15
        my $second = 0x11; # or 0b10001 or 17
        
        my $xored = $first ^ $second;
        
        if ($xored == 0b00100) # or == 4,  or == 0x04 
        {
            print "Good!";
        }
        

        顺便说一句,您还应该避免使用$a$b,因为它们对于sort 函数具有特殊含义。

        【讨论】:

          【解决方案4】:

          使用这个子程序:

          sub bin2dec {
              return unpack("N", pack("B32", substr("0" x 32 . shift, -32)));
          }
          

          它将字符串转换为整数,您可以对它们使用按位异或^,然后测试它是否等于4。

          【讨论】:

            【解决方案5】:

            您可以编写一些执行一位操作的函数:

            sub xor
            {
               my $p = shift;
               my $q = shift;
            
               return ( $p eq $q ) "0" : "1";
            }
            

            那么你可以为每对字符(每个连续的位)成功调用它。

            for (my $index = 0; $index < inputLength; $index++)
            {
                 $result = $result . xor ( substr ($a, $index, 1), substr ($b, $index, 1) );
            }
            

            其中inputLength$a$b 的长度。 这是一种方法。希望这会有所帮助!

            【讨论】:

              【解决方案6】:

              只要 $a 和 $b 有固定长度,比如 5:

               $a = '00011';
               $b = '00110';
               $xor = ($a ^ $b) | '00000';
              

              【讨论】:

                猜你喜欢
                • 2012-08-27
                • 1970-01-01
                • 2019-07-29
                • 1970-01-01
                • 2021-02-24
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多