У меня была эта проблема на Perl в течение нескольких дней, и после очистки бесчисленных страниц руководства, perldocs и googling слишком много поисковых запросов, надеюсь, кто-то здесь может мне помочь.Perl pack/unpack/shift
Мне даны две строки, которые представляют шестнадцатеричные значения, то есть «FFFF», а не шестнадцатеричный номер Perl 0xFFFF. Учитывая две из этих строк, я хочу преобразовать их в двоичную форму, выполнить побитовое И из двух, затем взять вывод этого и изучить каждый бит с младшего разряда до MSB.
У меня есть две проблемы прямо сейчас; преобразование шестнадцатеричной строки в шестнадцатеричное число и смещение результата побитового И.
Для преобразования шестнадцатеричной строки в шестнадцатеричное число, я попытался следующие подходы, которые, кажется, не работает, когда я распечатать их изучить:
$a = unpack("H*", pack("N*", $a));
$a = sprintf("%H", $a);
Использование «Печать», чтобы изучить каждый из них не показывает правильное значение, а также не использует «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);
Получающееся значение, которое я получаю, имеет двоичную форму, но не корректно.
Каков правильный способ выполнения такого рода операций?
Возможно, вы имели в виду 'while ($ num >> = 1)'? – mob
@mobrule: Наверное, да. Благодарю. –
Ах спасибо, теперь намного понятнее – materiamage