假設我有在Perl兩個字符串款待字符串作爲二進制和做二進制操縱在Perl
$a = "10001";
$b = "10101";
我需要找到這兩個字符串的按位異或,即
$a XOR $b = "00100";
我應該怎麼做在Perl中?
假設我有在Perl兩個字符串款待字符串作爲二進制和做二進制操縱在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 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!";
}
工程用數字和十六進制太:
01你自己,你可以使用一些文字信息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
函數有特殊的含義。
使用oct:
如果EXPR開始與
0b
,它被解釋爲一個二進制字符串。
#!/usr/bin/env perl
my ($x, $y) = map oct "0b$_", qw(10001 10101);
printf "%08b\n", $x^$y;
my $n1 = 0b10001;
my $n2 = 0b10101;
my $n = $n1^$n2;
say sprintf '%05b', $n;
進行XOR兩個數(從字符串形式開始):
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;
進行XOR兩個字符串:(任意長):
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';