String 将字符串视为二进制并在perl中执行二进制操作

String 将字符串视为二进制并在perl中执行二进制操作,string,perl,binary,bit-manipulation,String,Perl,Binary,Bit Manipulation,假设我在perl中有两个字符串 $a = "10001"; $b = "10101"; 我需要找到这两个字符串的按位异或,即 $a XOR $b = "00100"; 我应该如何在perl中执行此操作?您可以编写一些函数来执行一位操作: sub xor { my $p = shift; my $q = shift; return ( $p eq $q ) "0" : "1"; } 然后,您可以为每对字符和每一个连续位成功调用它 for (my $index = 0; $

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

$a = "10001";
$b = "10101";
我需要找到这两个字符串的按位异或,即

$a XOR $b = "00100";

我应该如何在perl中执行此操作?

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

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的长度。
这是一种方法。希望这有帮助

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

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的长度。 这是一种方法。希望这有帮助

使用此子例程:

sub bin2dec {
    return unpack("N", pack("B32", substr("0" x 32 . shift, -32)));
}
它将字符串转换为整数,您可以对其使用位异或,然后测试其是否等于4。

使用此子例程:

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

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

如果您自己声明信息,可以使用位文字:

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,因为它们对排序函数有特殊意义。

如果您自己声明信息,可以使用一些文字:

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,因为它们对排序功能有特殊意义。

使用:

如果EXPR以0b开头,它将被解释为二进制字符串

使用:

如果EXPR以0b开头,它将被解释为二进制字符串

致:

要对从字符串形式开始的两个数字进行异或运算:

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;
To:任意长度,只要两个字符串的长度相同:

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;
致:

要对从字符串形式开始的两个数字进行异或运算:

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;
To:任意长度,只要两个字符串的长度相同:

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;

如果$a和$b具有固定长度,则假设为5:

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

如果$a和$b具有固定长度,则假设为5:

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