Perl упаковать/распаковать/сдвинуть

У меня была эта проблема в Perl в течение нескольких дней, и после тщательного изучения бесчисленных справочных страниц, perldocs и слишком большого количества поисковых запросов, надеюсь, кто-то здесь может мне помочь.

Мне даны две строки, которые представляют шестнадцатеричные значения, то есть «FFFF», а не шестнадцатеричный номер Perl 0xFFFF. Учитывая две из этих строк, я хочу преобразовать их в двоичную форму, выполнить побитовое И двух, затем получить результат этого и проверить каждый бит от LSB до MSB.

У меня сейчас две проблемы; преобразование шестнадцатеричной строки в шестнадцатеричное число и сдвиг результата побитового И.

Для преобразования шестнадцатеричной строки в шестнадцатеричное число я пробовал следующие подходы, которые, похоже, не работают, когда я распечатываю их для проверки:

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

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

Использование "print" для проверки каждого из них не показывает правильное значение, равно как и использование "sprintf"...

Вторая проблема, с которой я столкнулся, возникает после того, как я выполняю побитовое И, и я хочу проверить каждый бит, сдвигая вправо на 1. Чтобы избежать предыдущей проблемы, я использовал реальные шестнадцатеричные числа Perl вместо шестнадцатеричных строк (0xffff вместо «ffff») . Если я попытаюсь выполнить сдвиг вправо следующим образом:

#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);

На данный момент все выглядит нормально, и с помощью «печати» я вижу, что значения операции И выглядят правильно, но когда я пытаюсь сдвинуться следующим образом:

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

Результирующее значение, которое я получаю, находится в двоичной форме, но неверно.

Каков правильный способ выполнения такого рода операции?


person materiamage    schedule 07.07.2010    source источник


Ответы (1)


Нет такого понятия, как «шестнадцатеричное число». Число — это число, шестнадцатеричное представление числа — это просто представление.

Просто превратите его в число и используйте побитовое и.

my $num = (hex $a) & (hex $b);
print ($num & 1, "\n") while ($num >>= 1)
person Anon.    schedule 07.07.2010
comment
Вы имели в виду while ($num >>= 1) ? - person mob; 08.07.2010
comment
@mobrule: Наверное, да. Спасибо. - person Anon.; 08.07.2010