假设我在 perl 中有两个字符串
$a = "10001";
$b = "10101";
我需要找到这两个字符串的按位异或,即
$a XOR $b = "00100";
我应该如何在 perl 中做到这一点?
假设我在 perl 中有两个字符串
$a = "10001";
$b = "10101";
我需要找到这两个字符串的按位异或,即
$a XOR $b = "00100";
我应该如何在 perl 中做到这一点?
异或两个数字:
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;
对两个字符串进行异或运算:(任何长度,只要两个字符串相同):
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;
使用八月:
如果 EXPR 以 开头
0b
,则将其解释为二进制字符串。
#!/usr/bin/env perl
my ($x, $y) = map oct "0b$_", qw(10001 10101);
printf "%08b\n", $x ^ $y;
如果您要自己声明信息,则可以使用一些文字:
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
and $b
,因为它们对sort
函数具有特殊含义。
使用这个子程序:
sub bin2dec {
return unpack("N", pack("B32", substr("0" x 32 . shift, -32)));
}
它将字符串转换为整数,您可以^
对它们使用按位异或,然后测试它是否等于 4。
只要 $a 和 $b 有一个固定的长度,比如说 5:
$a = '00011';
$b = '00110';
$xor = ($a ^ $b) | '00000';
您可以编写一些执行一位操作的函数:
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