Мне нужно работать с двоичным числом.
Я пытался написать:
const x = 00010000;
Но это не сработало.
Я знаю, что могу использовать шестнадцатеричное число с тем же значением, что 00010000
и у меня, но я хочу знать, есть ли тип в C ++ для двоичных чисел, и если нет, есть ли другое решение для моей проблемы?
00010000
это восьмеричное, верно? (И в вашей декларации отсутствует тип.)0b
только в C ++ 14). Они разработаны, чтобы быть однозначными.Ответы:
Вы можете использовать
BOOST_BINARY
во время ожидания C ++ 0x. :)BOOST_BINARY
возможно, имеет преимущество перед реализацией шаблона, поскольку его можно использовать и в программах на C (он на 100% управляется препроцессором).Чтобы сделать обратное (то есть распечатать число в двоичной форме), вы можете использовать непереносимую
itoa
функцию или реализовать свою собственную .К сожалению, вы не можете выполнять форматирование базы 2 с потоками STL (поскольку
setbase
учитываете только базы 8, 10 и 16), но вы можете использовать либоstd::string
версиюitoa
, либо (более краткую, но несколько менее эффективную)std::bitset
.производит:
Также прочитайте книгу Херба Саттера « Струнные форматеры усадебной фермы» для интересного обсуждения.
источник
int main() { cout << bitset<8>(42); }
bitset
подсказку, я уже исправил немногоsetbase
до того, как увидел твой комментарий.Если вы используете GCC, вы можете использовать расширение GCC (которое включено в стандарт C ++ 14 ) для этого:
источник
Вы можете использовать двоичные литералы. Они стандартизированы в C ++ 14. Например,
Поддержка в GCC
Поддержка в GCC началась в GCC 4.3 (см. Https://gcc.gnu.org/gcc-4.3/changes.html ) как расширение семейства языков C (см. Https://gcc.gnu.org/onlinedocs/gcc/. C-Extensions.html # C-Extensions ), но, начиная с GCC 4.9, он теперь распознается как функция C ++ 14 или расширение (см. Различие между двоичными литералами GCC и C ++ 14? )
Поддержка в Visual Studio
Поддержка в Visual Studio была запущена в Visual Studio 2015 Preview (см. Https://www.visualstudio.com/news/vs2015-preview-vs#C++ ).
источник
Самая левая цифра литерала все еще должна быть 1, но тем не менее.
источник
binary<10>::value == binary<010>::value
и некоторые проверки ошибок)В некоторых компиляторах (обычно для микроконтроллеров ) есть специальная функция, реализованная в распознавании буквенных двоичных чисел по префиксу «0b ...», предшествующему числу, хотя большинство компиляторов (стандарты C / C ++) не имеют такой возможности, и если это случай, вот мое альтернативное решение:
Недостатки (это не такие большие):
Преимущества :
spending processor time
в бессмысленных операциях (like "?.. :..", "<<", "+"
) с исполняемой программой (это может быть выполнено сто раз в конечном приложении);"mainly in C"
компиляторы, и C ++ (template+enum solution works only in C++ compilers
);"enum solution" (usually 255 = reach enum definition limit)
, иначе «буквальной константы», в компиляторе допускаются большие числа;several header files
(в большинстве случаев не легко читаемых и понятных), и заставляют проект становиться излишне запутанным и расширенным, например, используя"BOOST_BINARY()"
);источник
B_0100
не используется (вместо0100
)? Как напримерchar b = BYTE(0100,0001);
._B2H
функцией препроцессора.Эта тема может помочь.
Оно работает! (Все кредиты отправляются Тому Торфсу.)
источник
##
оператор препроцессора вставляет токены вместе. Таким образом, в этом случае, если вы звонитеHEX__(10)
, он расширяется до0x10LU
.Как уже было сказано, стандарты C не имеют возможности напрямую записывать двоичные числа. Однако есть расширения компилятора, и, очевидно, C ++ 14 включает
0b
префикс для двоичного кода. (Обратите внимание, что этот ответ был первоначально опубликован в 2010 году.)Один из популярных способов - включить заголовочный файл с вспомогательными макросами . Одним из простых вариантов также является создание файла, который включает определения макросов для всех 8-битных шаблонов, например:
Это приводит только к 256
#define
с, и, если требуются бинарные константы размером более 8 бит, эти определения могут быть объединены со сдвигами и OR, возможно, с вспомогательными макросами (например,BIN16(B00000001,B00001010)
). (Наличие отдельных макросов для каждого 16-разрядного, не говоря уже о 32-разрядном значении не представляется возможным.)Конечно, недостатком является то, что этот синтаксис требует записи всех начальных нулей, но это также может сделать его более понятным для таких применений, как установка битовых флагов и содержимого аппаратных регистров. Для функционально-подобного макроса, приводящего к синтаксису без этого свойства, см.
bithacks.h
Ссылку выше.источник
long long int
?Чрезмерное мышление C ++ уже хорошо учтено в других ответах здесь. Вот моя попытка сделать это с помощью мышления C, keep-it-simple-ffs:
источник
C не имеет нативной записи для чистых двоичных чисел. Ваша лучшая ставка здесь будет либо восьмеричной (например
07777
) шестнадцатеричной (например0xfff
).источник
Вы можете использовать функцию из этого вопроса, чтобы получить до 22 бит в C ++. Вот код из ссылки, соответственно отредактированный:
Таким образом, вы можете сделать что-то вроде
binary<0101011011>::value
.источник
Наименьшая единица, с которой вы можете работать, - это байт (который имеет
char
тип). Вы можете работать с битами, используя битовые операторы.Что касается целочисленных литералов, вы можете работать только с десятичными (основание 10), восьмеричными (основание 8) или шестнадцатеричными (основание 16) числами. В C и C ++ нет двоичных литералов (base 2).
Восьмеричные числа имеют префикс,
0
а шестнадцатеричные числа -0x
. Десятичные числа не имеют префикса.В C ++ 0x вы сможете делать то, что вы хотите, кстати, через пользовательские литералы .
источник
<shameless_plug>
stackoverflow.com/questions/2611764#2611883</shameless_plug>
0b00101010
для удобства. SDCC один, и я уверен, что есть и другие, которые тоже. (Правка: Ха, побей меня, @Джоу!)Вы также можете использовать встроенную сборку следующим образом:
Хорошо, это может быть несколько излишним, но это работает.
источник
На основании некоторых других ответов, но этот отклонит программы с недопустимыми двоичными литералами. Ведущие нули необязательны.
Пример:
источник
«Тип» двоичного числа совпадает с любым десятичным, шестнадцатеричным или восьмеричным числом:
int
(или даже символ, короткий, длинный длинный).Когда вы назначаете константу, вы не можете назначить ее с 11011011 (любопытно и к сожалению), но вы можете использовать hex. Гекс немного легче мысленно перевести. Разбить на кусочки (4 бита) и перевести на символ в [0-9a-f].
источник
Вы можете использовать битсет
источник
Я расширил хороший ответ, данный @ renato-chandelier, обеспечив поддержку:
_NIBBLE_(…)
- 4 бита, 1 клев в качестве аргумента_BYTE_(…)
- 8 бит, 2 клевы в качестве аргумента_SLAB_(…)
- 12 бит, 3 клевы в качестве аргумента_WORD_(…)
- 16 бит, 4 клев в качестве аргумента_QUINTIBBLE_(…)
- 20 бит, 5 кусков в качестве аргументов_DSLAB_(…)
- 24 бита, 6 кусков в качестве аргументов_SEPTIBBLE_(…)
- 28 бит, 7 кусков в качестве аргументов_DWORD_(…)
- 32 бита, 8 кусков в качестве аргументовЯ на самом деле не так уверен в терминах «quintibble» и «septibble». Если кто-нибудь знает какую-либо альтернативу, пожалуйста, дайте мне знать.
Вот макрос, переписанный:
А вот пример использования Ренато:
источник
Просто используйте стандартную библиотеку в C ++:
Вам нужна переменная типа
std::bitset
:В этом примере я сохранил двоичную форму
10
вx
.8ul
определяет размер ваших битов,7ul
значит, семь битов и так далее.источник
C ++ предоставляет стандартный шаблон с именем
std::bitset
. Попробуйте, если хотите.источник
Вы можете попробовать использовать массив
bool
:источник