У меня была эта проблема в 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);
Результирующее значение, которое я получаю, находится в двоичной форме, но неверно.
Каков правильный способ выполнения такого рода операции?