I extended the good answer given by @renato-chandelier by ensuring the support of:
_NIBBLE_(…)
– 4 bits, 1 nibble as argument
_BYTE_(…)
– 8 bits, 2 nibbles as arguments
_SLAB_(…)
– 12 bits, 3 nibbles as arguments
_WORD_(…)
– 16 bits, 4 nibbles as arguments
_QUINTIBBLE_(…)
– 20 bits, 5 nibbles as arguments
_DSLAB_(…)
– 24 bits, 6 nibbles as arguments
_SEPTIBBLE_(…)
– 28 bits, 7 nibbles as arguments
_DWORD_(…)
– 32 bits, 8 nibbles as arguments
I am actually not so sure about the terms “quintibble” and “septibble”. If anyone knows any alternative please let me know.
Here is the macro rewritten:
#define __CAT__(A, B) A##B
#define _CAT_(A, B) __CAT__(A, B)
#define __HEX_0000 0
#define __HEX_0001 1
#define __HEX_0010 2
#define __HEX_0011 3
#define __HEX_0100 4
#define __HEX_0101 5
#define __HEX_0110 6
#define __HEX_0111 7
#define __HEX_1000 8
#define __HEX_1001 9
#define __HEX_1010 a
#define __HEX_1011 b
#define __HEX_1100 c
#define __HEX_1101 d
#define __HEX_1110 e
#define __HEX_1111 f
#define _NIBBLE_(N1) _CAT_(0x, _CAT_(__HEX_, N1))
#define _BYTE_(N1, N2) _CAT_(_NIBBLE_(N1), _CAT_(__HEX_, N2))
#define _SLAB_(N1, N2, N3) _CAT_(_BYTE_(N1, N2), _CAT_(__HEX_, N3))
#define _WORD_(N1, N2, N3, N4) _CAT_(_SLAB_(N1, N2, N3), _CAT_(__HEX_, N4))
#define _QUINTIBBLE_(N1, N2, N3, N4, N5) _CAT_(_WORD_(N1, N2, N3, N4), _CAT_(__HEX_, N5))
#define _DSLAB_(N1, N2, N3, N4, N5, N6) _CAT_(_QUINTIBBLE_(N1, N2, N3, N4, N5), _CAT_(__HEX_, N6))
#define _SEPTIBBLE_(N1, N2, N3, N4, N5, N6, N7) _CAT_(_DSLAB_(N1, N2, N3, N4, N5, N6), _CAT_(__HEX_, N7))
#define _DWORD_(N1, N2, N3, N4, N5, N6, N7, N8) _CAT_(_SEPTIBBLE_(N1, N2, N3, N4, N5, N6, N7), _CAT_(__HEX_, N8))
And here is Renato's 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; */
00010000
is octal, right? (And your declaration is missing a type.) – Unlade0
. An integer literal is hexadecimal if it starts with0x
or0X
, binary (in C++14 or later) if it starts with0b
or0B
, octal if it starts with0
, and decimal otherwise. (Yes, that means0
is octal.) – Unladex
is not hexadecimal (A
,B
,C
,D
,E
,F
), and writing zeros in front of binary or hexadecimal numbers doesn't affect either one of them, so is it arbitrary to choose0b
for binaries? – Bedraggled0b
appears only in C++14). They're designed to be unambiguous. – Unlade