3.3.4.2 How Can I Access Individual Bits Of A Variable?
There are several ways of doing this. The simplest and most portable way is to define an integer variable and use macros to read, set, or clear the bits within the variable using a mask value and logical operations, such as the following.
#define testbit(var, bit) ((var) & (1 <<(bit)))
#define setbit(var, bit) ((var) |= (1 << (bit)))
#define clrbit(var, bit) ((var) &= ~(1 << (bit)))
These, respectively, test to see if bit number,
bit
, in the integer, var
, is set; set
the corresponding bit in var
; and clear the corresponding bit in
var
. Alternatively, a union of an integer variable and a
structure with bit-fields (see 5.3.5.2 Bit-fields In Structures) can be defined, e.g.,
union both {
unsigned char byte;
struct {
unsigned b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;
} bitv;
} var;
This allows you to access byte as a whole (using
var.byte
), or any bit within that variable independently (using
var.bitv.b0
through var.bitv.b7
).
Note that the compiler does support bit
variables (see
5.3.2.1 Bit Data Types And Variables), as well as
bit-fields in structures.