| 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 | |