Дополнительно
Существует ли конвертер printf для печати в двоичном формате?
Я могу вывести с помощью printf шестнадцатеричное или восьмеричное число. Существует ли тег формата для печати в двоичном виде или в виде произвольной базы?
Я использую gcc.
printf("%d %x %o\n", 10, 10, 10); //prints "10 A 12\n"
print("%b\n", 10); // prints "%b\n"
400
20
Суховато, но работает для меня:
&ЛТ;!----&ГТ;
Для многобайтовых типов
Вам нужно все лишние цитаты, к сожалению. Этот подход имеет риски, эффективность макросов (Дон'т передать функцию в качестве аргумента
BYTE_TO_BINARY
), но и избежать проблем с памятью и многократные вызовы функции strcat в некоторых других предложениях здесь.Печать бинарных для любого типа данных
тест
Вот быстрый хак, чтобы продемонстрировать методы, чтобы делать то, что вы хотите.
Нет'т двоичный спецификатор преобразования в glibc нормально.
Можно добавить пользовательские типы преобразования функции printf() семейство функций glibc. См. <а href="и http://www.gnu.org/software/libc/manual/html_node/Customizing-Printf.html"&ГТ; зарегистрироваться _function_printf\&ЛТ;/а&ГТ; для деталей. Можно добавить пользовательское %конверсии B для собственного использования, если это упрощает код приложения, чтобы иметь доступ к ней.
Вот в <а href="и http://codingrelic.geekhold.com/2008/12/printf-acular.html" и GT;пример&ЛТ;/а&ГТ; как реализовать пользовательские функции printf форматов в glibc.
Вы можете использовать маленький столик, чтобы улучшить скорость&ЛТ;суп&ГТ;1&ЛТ;/суп&ГТ;. Подобные методы являются полезными в embedded мире, например, инвертирование байта:
&ЛТ;суп&ГТ;1&ЛТ;/с SUP> Я'м, ссылаясь на встраиваемые приложения, где оптимизаторы не так агрессивно, и разница в скорости видна.
Печать наименьшего значащего бита и сдвиг на право. Делаем это до тех пор, пока число не станет равным нулю печатает двоичное представление числа без ведущих нулей, но в обратном порядке. Используя рекурсию, заказ может быть исправлено довольно легко.
Для меня это одна из самых чистых решений проблемы. Если вам нравится
0В
префикс и завершающий символ новой строки, я предлагаю оборачивать функцию.Демо
На основе @Уильям Уайт'ы ответьте, это макрос, который обеспечивает
int8
,16
,32
&амп;64
версий, повторного использованияINT8
макрос, чтобы избежать повторения.Этот выходы:
Для удобочитаемости можно добавить разделитель, например:
Здесь'ы на версию функции, которая не страдает от реентерабельность проблемы или ограничения на размер/тип аргумента:
Обратите внимание, что этот код будет работать так же хорошо работать для любой базы между 2 и 10, если вы просто замените 2's на нужные базы. Использование:
Где
X
- любое целостное выражение.Ни один из ранее опубликованы ответы на них именно то, что я ищу, поэтому я написал. Это супер проста в использовании %B С
Е
!Некоторые среды выполнения поддерживают "%b", хотя это не является стандартом.
Интересное обсуждение см. также здесь:
http://bytes.com/forum/thread591027.html
HTH
В
функции printf()
семья может только распечатать в основание 8, 10 и 16 с помощью стандартных описателей напрямую. Я предлагаю создать функцию, которая преобразует число в строку в код'с особыми нуждами.Распечатать в любое основание [2-36]
Все остальные ответы до сих пор имеют по крайней мере одно из этих ограничений.
Использование статической памяти для возвращения буфера. Это ограничивает количество раз, когда функция может быть использована в качестве аргумента для функции printf()`.
Выделить память, требующему код на бесплатную указатели.
Требуют вызывающий код, чтобы явно предоставить соответствующий буфер.
Называть функции printf () напрямую. Это обязывает новую функцию для
fprintf()
,функции sprintf()
,vsprintf ()
и т. д.Использовать уменьшенный диапазон целых чисел.
Следующий имеет ни один из перечисленных выше ограничений. Это требует С99 или поздно и использование в
"%Ы" и
. Он использует literal_ _compound для обеспечения буферного пространства. Он не имеет никаких проблем с нескольких вызовов в функции printf()`.Этот код должен обрабатывать ваши потребности до 64 бит. Я создал 2 функции pBin &амп; pBinFill. Оба делают то же самое, но pBinFill заполняет пробелы с fillChar. Функция тестирования генерирует тестовые данные, затем печатает его, используя функцию.
в <предварительно&ГТ;&ЛТ;код&ГТ;
типа char pBinFill(длинный тип int х,шар поэтому, голец fillChar); // вариант с заливкой типа char pBin(длинный тип int х, типа char так); // версия без заполнения на #определять kDisplayWidth 64
голец pBin(длинный тип int х,символ так) { чар ы[kDisplayWidth+1]; int я=kDisplayWidth; с[я -]=0х00; // завершить строку делать { // заполняем массив справа налево с[Я -]=(х &амп; 1) ? '1':'0'; // определить бит х&амп;ГТ;&амп;ГТ;=1; // сдвиг вправо на 1 бит } а( х &амп;ГТ 0); я++; // точка в последний допустимый символ функции sprintf(так, на"%Ы" В,С+я); // вставить его в temp строка строка возвращение так; } &ЛТ;/код&ГТ;&ЛТ;/пре&ГТ;
в <предварительно&ГТ;&ЛТ;код&ГТ; голец pBinFill(длинный тип int х,символ так, чар fillChar) { // заполняем массив справа налево чар ы[kDisplayWidth+1]; int я=kDisplayWidth; с[я -]=0х00; // завершить строку делать { // заполняем массив справа налево с[Я -]=(х &амп; 1) ? '1':'0'; х&амп;ГТ;&амп;ГТ;=1; // сдвиг вправо на 1 бит } а( х &амп;ГТ; 0); пока(я&амп;ГТ;=0) С[я -]=fillChar; // заполнить fillChar функции sprintf(так, на"%Ы" и,ы); возвращение так; } &ЛТ;/код&ГТ;&ЛТ;/пре&ГТ; в <предварительно&ГТ;&ЛТ;код&ГТ; недействительными тест() { Чара так[kDisplayWidth+1]; // буфер для работы pBin длинный вал инт=1; делать { функции printf(" по%ЛД =\т\т%#ЛК =\Т\t0b%я\с N&;, Вэл,Вэл,pBinFill(вал,так,'0')); Вэл*=11; // генерировать тестовые данные } пока (Вэл &амп;ЛТ; 100000000); }
Выход: 00000001 = 0x000001 = 0b00000000000000000000000000000001 00000011 = 0x00000b = 0b00000000000000000000000000001011 00000121 = 0x000079 = 0b00000000000000000000000001111001 00001331 = 0x000533 = 0b00000000000000000000010100110011 00014641 = 0x003931 = 0b00000000000000000011100100110001 00161051 = 0x02751b = 0b00000000000000100111010100011011 01771561 = 0x1b0829 = 0b00000000000110110000100000101001 19487171 = 0x12959c3 = 0b00000001001010010101100111000011 &ЛТ;/код&ГТ;&ЛТ;/пре&ГТ;
Может быть, немного ОТ, но если тебе это нужно только для отладки, чтобы понять или повторить некоторые бинарные операции вы делаете, вы могли бы взглянуть на wcalc (простой калькулятор консоли). С -B параметры, вы получаете двоичного выхода.
например в <предварительно&ГТ; $ wcalc -в ”(256 | 3) &амп; значение 0xFF"и = 0b11 &ЛТ;/пред&ГТ;
В стандартной библиотеке C нет функции форматирования для вывода двоичных данных подобным образом. Все операции форматирования, поддерживаемые семейством printf, направлены на создание текста, читаемого человеком.
Следующая рекурсивная функция может быть полезной:
Я оптимизировал лучшие решения для размер и C++-Несс, и нужно это решение:
Нет стандартного и портативного способа.
Некоторые реализации предоставляют itoa(), но это не будет в большинстве, и у него несколько некачественный интерфейс. Но код находится за ссылкой и должен позволить вам реализовать свой собственный форматтер довольно легко.
Мне понравился код на Игра paniq, статический буфер-это хорошая идея. Однако это не удается, если вы хотите использовать несколько двоичных форматов в одной функции printf (), потому что она всегда возвращает тот же указатель и перезаписывает массив.
Здесь'ы с падени-в стиле, который вращает указатель на буфер сплит.