2

私はここ数日間、Perl でこの問題を抱えていました。数え切れないほどの man ページ、perldocs、およびあまりにも多くの検索用語をグーグル検索した後、ここの誰かが私を助けてくれることを願っています.

Perl の 16 進数 0xFFFF ではなく、16 進数の値、つまり「FFFF」を表す 2 つの文字列が与えられます。これらの文字列のうち 2 つが与えられた場合、それらをバイナリ形式に変換し、2 つのビットごとの AND を実行してから、この出力を取得し、LSB から MSB までの各ビットを調べます。

現在、2 つの問題があります。16 進文字列を 16 進数に変換し、ビットごとの AND の結果をシフトします。

16 進文字列を 16 進数に変換するために、次のアプローチを試しましたが、それらを印刷して調べたときに機能しないようです。

$a = unpack("H*", pack("N*", $a));

$a = sprintf("%H", $a);

「print」を使用してこれらのそれぞれを調べても、正しい値が表示されず、「sprintf」を使用しても表示されません...

2 番目の問題は、ビットごとの AND を実行した後に発生し、右に 1 シフトして各ビットを調べたいと考えています。前の問題を回避するために、16 進文字列の代わりに実際の Perl 16 進数を使用しました ("ffff" ではなく 0xffff)。 . 次のように右シフトを実行しようとすると:

#Convert from hex number to binary number

$a = sprintf("%B", $a);
$b = sprintf("%B", $b);

$temp = pack("B*", $a) & pack("B*", $b);
$output = unpack("B*", $temp);

この時点ですべて問題ないように見えます。「print」を使用すると、AND 演算の値が正しく見えることがわかりますが、次のようにシフトしようとすると、次のようになります。

$output = pack("B*", $output);
$output = $output >> 1;
$output = unpack("B*", $output);

得られた結果の値はバイナリ形式ですが、正しくありません。

この種の操作を実行する正しい方法は何ですか?

4

1 に答える 1

9

「16 進数」などというものはありません。数値は数値であり、数値の 16 進表現はまさにその表現です。

それを数値に変換し、ビット単位の and を使用するだけです。

my $num = (hex $a) & (hex $b);
print ($num & 1, "\n") while ($num >>= 1)
于 2010-07-07T22:04:32.137 に答える