Skip to content

Bit Manipulation

#define BIT(n) (1ull << (n))
#define BIT_SET(val, n) ((val) | BIT(n))
#define BIT_CLEAR(val, n) ((val) & ~BIT(n))
#define BIT_TEST(val, n) (((val) >> (n)) & 1ull)
#define BIT_TOGGLE(val, n) ((val) ^ BIT(n))
#define BIT_RANGE(val, lo, hi) \ (((val) >> (lo)) & ((1ull << ((hi) - (lo) + 1ull)) - 1ull))
#define BIT_MASK(lo, hi) (((1ull << ((hi) - (lo) + 1ull)) - 1ull) << (lo))
#define SET_FIELD(val, field_val, lo, hi) \ (((val) & ~BIT_MASK(lo, hi)) | (((field_val) << (lo)) & BIT_MASK(lo, hi)))
#define BIT_ANY(val, mask) (((val) & (mask)) != 0)
#define BIT_ALL(val, mask) (((val) & (mask)) == (mask))
#define BIT_WIDTH(lo, hi) ((hi) - (lo) + 1u)