一位操作

#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); 

putao
5 声望0 粉丝

推动世界向前发展,改善民生。