Binary constant macros

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)

Reply to
Tom Torfs
Loading thread data ...

... snip ...

That is rather cute. You should wrap the macro file in an include guard. The comma separation on byte boundaries especially adds clarity. It does have some portability problems outside the normal world of 8 bit bytes and 16/32 bit short/longs.

--
Chuck F (cbfalconer@yahoo.com) (cbfalconer@worldnet.att.net)
   Available for consulting/temporary embedded and systems.
     USE worldnet address!
Reply to
CBFalconer

Very good!

Regards Sergio Masci

formatting link
- optimising structured PIC BASIC compiler

Reply to
Sergio Masci
[whatever = B8(10101010); using long hex constants}

really clever, thanks!

Oliver

--
Oliver Betz, Muenchen
Reply to
Oliver Betz

Sweet and evil. I like it.

pete

--
pete@fenelon.com "there's no room for enigmas in built-up areas"
Reply to
Pete Fenelon

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 snipped-for-privacy@bdsoft.com

formatting link
-- On-Site Training in C/C++, Java, Perl & Unix C++ users: Download BD Software's free STL Error Message Decryptor at
formatting link

Reply to
Leor Zolman

Me too. Suggest you write it up for Dr. Dobbs.

Best regards, Spehro Pefhany

--
"it's the network..."                          "The Journey is the reward"
speff@interlog.com             Info for manufacturers: http://www.trexon.com
Embedded software/hardware/analog  Info for designers:  http://www.speff.com
Reply to
Spehro Pefhany

Between this and the URL of the unmaintainable code site it has been a glorious day for comp.arch.embedded! Thanks, Tom. Your contribution has already enhanced my current project!

-- ======================================================================== Michael Kesti | "And like, one and one don't make | two, one and one make one." snipped-for-privacy@gv.net | - The Who, Bargain

Reply to
Michael R. Kesti

Hello,

thanks a lot, very helpful and very ingenious. I think you will even manage to define macros for numbers with neither decimal base nor a power of two as base. But what is the use of compile time constant with a base of seven or twelve? I can imagine no example, but maybe somebody else can. ;-)

Bye

Reply to
Uwe Hercksen

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.