Преобразования между двоичной и десятичной системами счисления
Проблема
Имеется десятичное число, которое необходимо вывести в двоичном представлении, или наоборот,
двоичная последовательность, которую требуется преобразовать в десятичное число.
Такие задачи часто возникают при отображении нетекстовых данных — например, полученных в процессе
взаимодействия с некоторыми системными функциями и программами.
Решение
Чтобы преобразовать целое число Perl в строку, состоящую из единиц и нулей, сначала
упакуйте его в сетевой формат "N" (с начальным старшим байтом), а затем снова распакуйте по
одному биту (формат "B32").
sub dec2bin {
my $str = unpack("B32", pack("N", shift));
$str =~ s/^0+(?=\d)//; # В противном случае появятся начальные нули
return $str;
}
Чтобы преобразовать строку из единиц и нулей в целое число Perl, дополните ее необходимым
количеством пулей, а затем выполните описанную выше процедуру в обратном порядке:
sub bin2dec {
return unpack("N", pack("B32", substr("0" x 32, shift, -32)));
}
Комментарий
Речь идет о преобразовании чисел между строками вида "00100011" и десятичной системой счисления (35).
Строка содержит двоичное представление числа. На этот раз функция
sprintf не поможет:
в ней не предусмотрен формат для вывода чисел в двоичной системе счисления. Следовательно, нам придется
прибегнуть к функциям Perl
pack и
unpack для непосредственных манипуляций со строковыми данными.
Функции pack и unpack
предназначены для работы со строками. Строки можно интерпретировать как последовательности битов,
байты, целые, длинные целые, числа с плавающей запятой в представлении IEEE, контрольные суммы —
не говоря уже о многом другом. Обе функции, pack и unpack, по аналогии со sprintf получают форматную
строку, которая определяет выполняемые с аргументом операции.
Мы используем pack и unpack для интерпретации строк как последовательностей битов и двоичного
представления целого числа. Чтобы понять, каким образом строка интерпретируется как последовательность битов,
необходимо хорошо разобраться в поведении функции pack. Строка интерпретируется как последовательность
байтов, состоящих из восьми бит. Байты всегда нумеруются слева направо (первые восемь бит образуют первый
байт, следующие восемь бит — второй и т. д.), однако внутри каждого байта биты могут нумероваться как слева
направо, так и справа налево.
Функция pack с шаблоном "В" работает с битами каждого байта, пронумерованными слева направо.
Именно в этом порядке они должны находиться для применения формата "N", которым мы воспользуемся для
интерпретации последовательности битов как 32-разрядного целого.
$num = bin2dec('0110110'); # $num =54
$binstr = dec2bin(54); # $binstr = 110110
См. также
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|