Can I use a binary literal in C or C++?

前端 未结 19 2424
梦如初夏
梦如初夏 2020-11-22 07:40

I need to work with a binary number.

I tried writing:

const x = 00010000;

But it didn\'t work.

I know that I can use an hex

19条回答
  •  感情败类
    2020-11-22 08:00

    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; */
    

提交回复
热议问题