Portable arrays of bits

Ray Butterworth rbutterworth at watmath.UUCP
Thu Nov 6 23:59:09 AEST 1986


> Is there a standard, machine independant way of defining an array 
> of bits?  I am writing code and do not want to have to do a function
> call each time I reference a bit, but want a Boolean array packed
> as tightly as possible.

Some machines have fast function calls and assembler instructions for
directly addressing bits.   But if you want portable, how about this?
It should run on any C with an appropriate setting of the first define.
Make sure that the _BPW_ is 36 or 16 or however many bits there are in
an (int) on your machine.  Make sure you use (int) and not (long) or (char)
for the array; on many machines accessing a (char) is a lot more work than
accessing an (int).

#define _BPW_ (36)      /* bits per word (natural machine size, not char) */

#define _BIT_(bit) (1<<((bit)%_BPW_))                     /* internal use */
#define _WORD_(name,bit) ((name)[(bit)/_BPW_])            /* internal use */

#define DECLARE(name,bits) int name[1+((bits)/_BPW_)]

#define SET(name,bit)   (_WORD_(name,bit)|=_BIT_(bit))
#define CLEAR(name,bit) (_WORD_(name,bit)&=~_BIT_(bit))
#define FLIP(name,bit)  (_WORD_(name,bit)^=_BIT_(bit))

#define TEST(name,bit) ((_WORD_(name,bit)&_BIT_(bit))!=0)
#define SAME(name1,name2,bit) \
  (((_WORD_(name1,bit)^_WORD_(name2,bit))&_BIT_(bit))==0)
etc.



More information about the Comp.lang.c mailing list