On 26 Feb 2004 07:36:35 -0800,
tomtorfs@village.uunet.be (Tom Torfs) wrote:
[color=blue]
>Hello All,
>
>I've been missing the lack of support for binary numeric literals in
>C. To get around it I wrote the following handy macros, which allows
>you to simply write something like:
>
>whatever = B8(10101010);
>
>and will translate as:
>
>whatever = 85;
>
>(compile-time constant)
>
>Code below... hopefully it's useful to some of you as well.
>
>greetings,
>Tom
>
>/* Binary constant generator macro
> By Tom Torfs - donated to the public domain
>*/
>
>/* All macro's evaluate to compile-time constants */
>
>/* *** helper macros *** /
>
>/* turn a numeric literal into a hex constant
> (avoids problems with leading zeroes)
> 8-bit constants max value 0x11111111, always fits in unsigned long
>*/
>#define HEX__(n) 0x##n##LU
>
>/* 8-bit conversion function */
>#define B8__(x) ((x&0x0000000FLU)?1:0) \
> +((x&0x000000F0LU)?2:0) \
> +((x&0x00000F00LU)?4:0) \
> +((x&0x0000F000LU)?8:0) \
> +((x&0x000F0000LU)?16:0) \
> +((x&0x00F00000LU)?32:0) \
> +((x&0x0F000000LU)?64:0) \
> +((x&0xF0000000LU)?128:0)
>
>/* *** user macros *** /
>
>/* for upto 8-bit binary constants */
>#define B8(d) ((unsigned char)B8__(HEX__(d)))
>
>/* for upto 16-bit binary constants, MSB first */
>#define B16(dmsb,dlsb) (((unsigned short)B8(dmsb)<<8) \
> + B8(dlsb))
>
>/* for upto 32-bit binary constants, MSB first */
>#define B32(dmsb,db2,db3,dlsb) (((unsigned long)B8(dmsb)<<24) \
> + ((unsigned long)B8(db2)<<16) \
> + ((unsigned long)B8(db3)<<8) \
> + B8(dlsb))
>
>/* Sample usage:
> B8(01010101) = 85
> B16(10101010,01010101) = 43605
> B32(10000000,11111111,10101010,01010101) = 2164238933
>*/
>
>greetings,
>Tom[/color]
This may be closest thing I've seen to C++ template metaprogramming... in
C. And it doesn't even require the most up-to-date compilers! ;-)
Very useful.
-leor
Leor Zolman
BD Software
leor@bdsoft.com www.bdsoft.com -- On-Site Training in C/C++, Java, Perl & Unix
C++ users: Download BD Software's free STL Error Message
Decryptor at
www.bdsoft.com/tools/stlfilt.html