1

perlに2つの文字列があるとします

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

これら2つの文字列のビットごとのxorを見つける必要があります

$a XOR $b = "00100";

perl でこれを行うにはどうすればよいですか?

4

6 に答える 6

4

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;
于 2012-04-27T02:03:12.427 に答える
3

octを使用します:

EXPRがで始まる場合0b、それはバイナリ文字列として解釈されます。

#!/usr/bin/env perl

my ($x, $y) = map oct "0b$_", qw(10001 10101);
printf "%08b\n", $x ^ $y;
于 2012-04-26T23:35:23.533 に答える
2

自分で情報を宣言する場合は、少しリテラルを使用できます。

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

于 2012-04-26T23:25:20.133 に答える
1

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.

于 2012-04-26T23:17:45.463 に答える
0

$a と $b が固定長である限り、5 とします。

 $a = '00011';
 $b = '00110';
 $xor = ($a ^ $b) | '00000';
于 2012-04-27T09:27:11.580 に答える
0

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!

于 2012-04-26T23:17:17.540 に答える