位运算两大公式:
1.将数据的某个bit位清0,其它位保持不变(连续多位或一位,若不连续则多次使用一位即可)
A & = ~(B<< C) 等价于 A = A & ~ (B << C)
A:要修改的数据
B:要修改的位数对应的全为1时的值
C:要修改的起始位(从低位到高位数)
要修改的位数 2进制 16进制
1 1 0x1
2 11 0x3
3 111 0x7
4 1111 0xF
5 11111 0x1F
6 111111 0X3F
7 1111111 0X7F
8 11111111 0XFF
例如:
int a = 0x5F // 0101 1111
目标:将a从第1位开始,连续3个bit位全清0,其它保持不变
a = a & ~ (0x7 << 1)
推导:
1.0x7 << 1
0000 0000 0000 0000 0000 0000 0000 1110
2.~(0x7 << 1)
1111 1111 1111 1111 1111 1111 1111 0001
3.a的2进制
0000 0000 0000 0000 0000 0000 0101 1111
4.a & ~ (0x7 << 1)
0000 0000 0000 0000 0000 0000 0101 0001
2.将数据某个bit位 置1,而其它位保持不变:
A | = (B << C) 等价于 A = A | (B << C)
目标:将a从第1位开始,连续3个bit的 0 全置为1,其它保持不变
a = a|(0x7 << 1)
3.其中B可以换为指定数
a = 0xabcd1234; // 目标:将其中cd12变成12cd,其它位置不变
a = a & ~(0xFFFF << 8); // 现将a从第8位开始,连续16位全部清零,即将cd12清零
a = a | (0x12cd << 8); // 然后将0x12cd放置到刚才清零的位置上