一位操作
#define BIT(n) (1 << (n))
unsigned char reg = 0x00;
1 设置某一位
reg |= BIT(1);
// reg 现在是 0x02
2 清除某一个位
reg &= ~BIT(1);
3 翻转某一位
reg ^=BIT(1)
4 检查某个特定位
if (reg & BIT(1)) {
//ture了, 执行xxx
}
5 提取某一位,&1 相当于其他位都清空,第一位保留
#define GET_BIT(value, bit) (((value) >> (bit)) & 1)
unsigned int bit = GET_BIT(value, 3); // 提取第3位
6 循环左移
unsigned int rol(unsigned int value, unsigned int shift) {
return (value << shift) | (value >> (32 - shift));
}
7 循环右移 //todo
unsigned int ror(unsigned int value, unsigned int shift) {
return (value >> shift) | (value << (32 - shift));
}
多位操作
减去1的操作会将最右边的1变为0,并将其右边的所有位变为1。
(1 << 8) - 1
0000 0001 0000 0000 (二进制) = 256 (十进制)
- 1
-------------------
0000 0000 1111 1111 (二进制) = 255 (十进制) = 0xFF (十六进制)
8 多位提取:(想要多少位就移动多少,想要的位是你以后的之后开始,就相当于从0位开始要了)
#define GET_BITS(value, start, length) (((value) >> (start)) & ((1 << (length)) - 1))
unsigned int bits = GET_BITS(value, 8, 8); // 提取从第8位开始的8位
9 合并(想要的一段清空,放入0, 然后放入新值)
#define SET_BITS(value, start, length, new_bits) \
((value) = ((value) & ~(((1 << (length)) - 1) << (start))) | ((new_bits) << (start)))
SET_BITS(value, 8, 8, 0xAB);
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。