perlに2つの文字列があるとします
$a = "10001";
$b = "10101";
これら2つの文字列のビットごとのxorを見つける必要があります
$a XOR $b = "00100";
perl でこれを行うにはどうすればよいですか?
perlに2つの文字列があるとします
$a = "10001";
$b = "10101";
これら2つの文字列のビットごとのxorを見つける必要があります
$a XOR $b = "00100";
perl でこれを行うにはどうすればよいですか?
2 つの数値をxor するには:
my $n1 = 0b10001;
my $n2 = 0b10101;
my $n = $n1 ^ $n2;
say sprintf '%05b', $n;
2 つの数値を 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;
2 つの文字列をxorするには: (両方の文字列が同じである限り、任意の長さ):
my $n1 = '10001';
my $n2 = '10101';
my $n = ($n1 ^ $n2) | ("\x30" x length($n1));
say $n;
2 つの文字列を 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;
octを使用します:
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!";
}
数字と16進数でも動作します:
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!";
}
余談ですが、 and は関数にとって特別な意味を持つため、使用も避ける必要が$a
あり$b
ますsort
。
Use this subroutine:
sub bin2dec {
return unpack("N", pack("B32", substr("0" x 32 . shift, -32)));
}
It will convert the strings to integers, and you can use the bitwise XOR ^
on them, then test if that equals 4.
$a と $b が固定長である限り、5 とします。
$a = '00011';
$b = '00110';
$xor = ($a ^ $b) | '00000';
You could write a few functions that does the one-bit operation:
sub xor
{
my $p = shift;
my $q = shift;
return ( $p eq $q ) "0" : "1";
}
then you could call this successfully for each pair of characters (each successive bit).
for (my $index = 0; $index < inputLength; $index++)
{
$result = $result . xor ( substr ($a, $index, 1), substr ($b, $index, 1) );
}
Where inputLength
is the length of $a
and $b
.
This is one way of doing it. Hope this helps!