C语言:一组位操作宏

解析协议时,取得位域的值是一种常见操作,这些宏可以辅助我们工作。

/*
**  将x的第n位置1
**
**  x = 0x00000000
**  BIT_SET(x, 7) = 0x00000080
*/
#define BIT_SET(x, n)   ((x) | (1 << (n)))

/*
**  将x的第n位置为0
**
**  x = 0x00000080
**  BIT_CLR(x, 7) = 0x00000000
*/
#define BIT_CLR(x, n)   ((x) & ~(1 << (n)))

/*
**  将x的第n到m位置位(使用0U而非0很关键,0的类型是int)
**
**  x = 0x00000000
**  BITS_SET(x, 8, 15) = 0x0000FF00
*/
#define BITS_SET(x, n, m)   ((x) | ((~0U >> (sizeof((x)) * 8 - ((m) - (n) + 1))) << n))

/*
**  清除x的第n到m位
**
**  x = 0x11223344
**  BITS_CLR(x, 8, 15) = 0x11220044
*/
#define BITS_CLR(x, n, m)  ((x) & ~((~0U >> (sizeof((x)) * 8 - ((m) - (n) + 1))) << n))

/*
**  获取x第n到m位的真值
**
**  x = 0x11223344
**  BITS_GET(x, 8, 15) = 0x00003300
*/
#define BITS_GET(x, n, m)   ((x) & (((1 << ((m) - (n) + 1)) - 1) << (n)))

/*
**  获取x第n到m位的数值
**
**  x = 0x11223344
**  BITS_VAL(x, 8, 15) = 0x00000033
*/
#define BITS_VAL(x, n, m)   (((x) & (((1 << ((m) - (n) + 1)) - 1) << (n))) >> n)

/*
**  设置x的第n到m位为指定值v
**
**  x = 0b110[0111]1
**  BITS_PUT(x, 1, 4, 0b1101) = 0b110[1101]1
**
*/
#define BITS_PUT(x, n, m, v) (BITS_CLR(x, n, m) | (v << n))

这是测试程序

int main()
{
    assert(BIT_SET(0x00000000, 7) == 0x00000080);
    assert(BIT_CLR(0x00000080, 7) == 0x00000000);
    assert(BITS_SET(0x00000000, 8, 15) == 0x0000FF00);
    assert(BITS_GET(0x11223344, 8, 15) == 0x00003300);
    assert(BITS_VAL(0x11223344, 8, 15) == 0x00000033);
    assert(BITS_CLR(0x11223344, 8, 15) == 0x11220044);
    assert(BITS_PUT(0b11001111, 1, 4, 0b1101) == 0b11011011);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值