Linux printf для преобразования десятичного числа в двоичное? - PullRequest
0 голосов
/ 25 августа 2018

Очень легко преобразовать десятичное число в шестнадцатеричное или октябрьское с помощью функции printf в Linux с указателем формата %x и %o соответственно.

user@linux:~$ file /usr/bin/printf
/usr/bin/printf: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0
user@linux:~$ 

user@linux:~$ printf "Dec to Hex = %x\n" 255
Dec to Hex = ff
user@linux:~$ 

user@linux:~$ printf "Dec to Oct = %o\n" 255    
Dec to Oct = 377
user@linux:~$ 

Я пытался преобразовать аналогичное десятичное числов двоичный файл, но это не сработало

user@linux:~$ printf "Dec to Bin = %b\n" 255    
Dec to Bin = 255
user@linux:~$ 

Возможно ли преобразовать декабрь в корзину с помощью функции printf в Linux?

Что еще (преобразование чисел) можно сделать в Linuxprintf?

От шестнадцатеричного до десятичного?От шестнадцатеричного до октального?Hex to Binary?

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Возможно ли преобразовать Dec в Bin с помощью функции printf в Linux?

Нет, C printf не имеет модификатора формата для двоичного форматирования (http://www.cplusplus.com/reference/cstdio/printf/), и утилита linux printf также не расширяет его (%b is "расширяет escape-последовательности обратной косой черты в соответствующем аргументе" ).Инструмент printf все еще может быть омрачен вашей конкретной оболочкой, которая может в конечном итоге добавить больше форматеров, тогда вам придется проверить руководство по вашей оболочке (например, bash несколько расширяет его , но по-прежнему нет "бинарного""formatter).

Что еще (преобразование чисел) можно сделать с помощью Linux printf?

От шестнадцатеричного до десятичного?От шестнадцатеричного до октального?От шестнадцатеричного к двоичному?

Он должен поддерживать общие входы в формате C (т. Е. 0xN для шестнадцатеричного ввода и 0N для восьмеричного ввода), например:

$ printf "%d %d %#x %#o\n" 0x10 010 16 8
16 8 0x10 010

Так что да, вы можете в основном конвертировать десятичную / шестнадцатеричную / восьмеричную в десятичную / шестнадцатеричную / восьмеричную, любую комбинацию, используя желаемый формат ввода и формат вывода.

На самом деле вы как бы думаете об этом неправильно, это отдельныйвходное в двоичное преобразование и двоичное в выходное, т. е. когда вы помещаете «16» в качестве значения аргумента для printf, оно передается инструменту в виде строки, затем он анализирует строку по анализатору значения, обнаруживая «16» в десятичном формате, преобразовываяэто к собственному целочисленному значению 16 (т. е. двоичное внутри процессора), и затем оно, наконец, преобразует его обратно в строку в соответствии со спецификатором формата в строке формата, то есть "% # x" произведет шестнадцатеричное форматирование этого внутреннего (двоичного) целого числаvalue ("0x10").

Если вы хотите, чтобы "двоичный" вывод для вас проверял значение, опытные программисты на ассемблере не будут беспокоиться об этом,они учатся читать шестнадцатеричное число на отдельные биты, потому что в шестнадцатеричном формате каждая цифра состоит ровно из 4 битов (0000 = 0x0, 0001 = 0x1, ..., 1110 = 0xE, 1111 = 0xF), поэтому с помощью шестнадцатеричного форматирования вы можете вполнелегко читать любой интересующий вас фрагмент.Хотя истинный двоичный вывод делает его немного проще, показывая непосредственно 0/1, но с 32- и 64-битными значениями он немного длиннее и затрудняет сохранение информации о положении, эта часть несколько проще в шестнадцатеричном виде (так как каждый двацифры 8 бит = один байт).

0 голосов
/ 26 августа 2018

Не удается найти способ с printf. Вместо этого вы можете использовать dc.

nb=255 ; dc -e '[dec to bin = ] 10 i 2 o '"$nb"' r n p'

dec to bin = 11111111

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...