以下位操作以如下图序列,小端序:
获取某一位:
#define GET_BIT(x, bit) ((x & (1 << bit)) >> bit) /* 获取第bit位 */
清0某一位:
#define CLEAR_BIT(x, bit) (x &= ~(1 << bit)) /* 清零第bit位 */
置位某一位:
#define SET_BIT(x, bit) (x |= (1 << bit)) /* 置位第bit位 */
获取连续几位的值(uint8_t):
/* 获取第[n:m]位的值 */
#define BIT_M_TO_N(x, m, n) ((uint8_t)((uint8_t)x << (7-(n))) >> ((7- (n)) + (m)))
如获取x值的[3:2]位的值,则为 BIT_M_TO_N(x,2,3)
清0连续几位的值(uint8_t)
#define CLEAR_M_TO_N(x,m,n) ((x)&(~((BIT_M_TO_N(0xffu,m,n))<<(m))))
置位连续几位的值(uint8_t)
#define SET_M_TO_N(x,m,n) ((x)|((BIT_M_TO_N(0xffu,m,n))<<(m)))
获取连续几位的值(uint32_t):
/* 获取第[n:m]位的值 */
#define BIT_M_TO_N(x, m, n) ((unsigned int)(x << (31-(n))) >> ((31 - (n)) + (m)))
清0连续几位的值(uint32_t)
#define CLEAR_M_TO_N(x,m,n) ((x)&(~((BIT_M_TO_N(0xffffffffu,m,n))<<(m))))
置位连续几位的值(uint32_t)
#define SET_M_TO_N(x,m,n) ((x)|((BIT_M_TO_N(0xffffffffu,m,n))<<(m)))