1/* @title: Bit Manipulation */
2#pragma once
3#define BIT(n) (1ull << (n))
4
5#define BIT_SET(val, n) ((val) | BIT(n))
6#define BIT_CLEAR(val, n) ((val) & ~BIT(n))
7#define BIT_TEST(val, n) (((val) >> (n)) & 1ull)
8#define BIT_TOGGLE(val, n) ((val) ^ BIT(n))
9
10#define BIT_RANGE(val, lo, hi) \
11 (((val) >> (lo)) & ((1ull << ((hi) - (lo) + 1ull)) - 1ull))
12
13#define BIT_MASK(lo, hi) (((1ull << ((hi) - (lo) + 1ull)) - 1ull) << (lo))
14
15#define SET_FIELD(val, field_val, lo, hi) \
16 (((val) & ~BIT_MASK(lo, hi)) | (((field_val) << (lo)) & BIT_MASK(lo, hi)))
17
18#define BIT_ANY(val, mask) (((val) & (mask)) != 0)
19#define BIT_ALL(val, mask) (((val) & (mask)) == (mask))
20
21/* Count of bits in a range */
22#define BIT_WIDTH(lo, hi) ((hi) - (lo) + 1u)
23