Несколько компиляторов (обычно для микроконтроллеров ) имеют специальную функцию, реализованную в распознавании буквенных двоичных чисел по префиксу "0b ..." перед числом, хотя большинство компиляторов (Стандарты C / C ++) не имеют такой возможности, и если это так, вот мое альтернативное решение:
#define B_0000 0
#define B_0001 1
#define B_0010 2
#define B_0011 3
#define B_0100 4
#define B_0101 5
#define B_0110 6
#define B_0111 7
#define B_1000 8
#define B_1001 9
#define B_1010 a
#define B_1011 b
#define B_1100 c
#define B_1101 d
#define B_1110 e
#define B_1111 f
#define _B2H(bits) B_##bits
#define B2H(bits) _B2H(bits)
#define _HEX(n) 0x##n
#define HEX(n) _HEX(n)
#define _CCAT(a,b) a##b
#define CCAT(a,b) _CCAT(a,b)
#define BYTE(a,b) HEX( CCAT(B2H(a),B2H(b)) )
#define WORD(a,b,c,d) HEX( CCAT(CCAT(B2H(a),B2H(b)),CCAT(B2H(c),B2H(d))) )
#define DWORD(a,b,c,d,e,f,g,h) HEX( CCAT(CCAT(CCAT(B2H(a),B2H(b)),CCAT(B2H(c),B2H(d))),CCAT(CCAT(B2H(e),B2H(f)),CCAT(B2H(g),B2H(h)))) )
// Using example
char b = BYTE(0100,0001); // Equivalent to b = 65; or b = 'A'; or b = 0x41;
unsigned int w = WORD(1101,1111,0100,0011); // Equivalent to w = 57155; or w = 0xdf43;
unsigned long int dw = DWORD(1101,1111,0100,0011,1111,1101,0010,1000); //Equivalent to dw = 3745774888; or dw = 0xdf43fd28;
Недостатки (это не такие большие):
- Двоичные числа должны быть сгруппированы 4 по 4;
- Двоичные литералы должны быть только целыми числами без знака;
Преимущества
- Общее количество операций препроцессора, не
spending processor time
в бессмысленных операциях (like "?.. :..", "<<", "+"
) с исполняемой программой (это может быть выполнено сто раз в конечном приложении);
- Работает
"mainly in C"
компиляторы и C ++ (template+enum solution works only in C++ compilers
);
- Имеет только ограничение "longness" для выражения значений "literal constant". Было бы раннее ограничение длинны (обычно 8 битов: 0-255), если бы кто-либо выражал постоянные значения путем анализа разрешения
"enum solution" (usually 255 = reach enum definition limit)
, иначе, ограничения «буквальной константы» в компиляторе допускают большие числа;
- Некоторые другие решения требуют преувеличенного числа определений констант (на мой взгляд, слишком много определений), включая long или
several header files
(в большинстве случаев не легко читаемые и понятные, и делают проект излишне запутанным и расширенным, например, используя "BOOST_BINARY()"
);
- Простота решения: легко читаемый, понятный и настраиваемый для других случаев (может быть расширен для групп 8 на 8);