C语言高效位操作
思考:
1、 如何将一个数据中的多个不连续位清位?
1、 如何将一个数据中的多个不连续位置位?
1、 如何反转一个数据中的多个不连续位(1->0, 0->1)?
基础知识:C 语言位操作
1 /***********位与***********/ 2 /************************/ 3 0 & 0 = 0; 4 0 & 1 = 0; 5 1 & 0 = 0; 6 1 & 1 = 1; 7 8 /***********位或***********/ 9 /************************/ 10 0 | 0 = 0; 11 0 | 1 = 1; 12 1 | 0 = 1; 13 1 | 1 = 1; 14 15 /***********异或***********/ 16 /************************/ 17 0 ^ 0 = 0; 18 0 ^ 1 = 1; 19 1 ^ 0 = 1; 20 1 ^ 1 = 0; 21 22 /***********位取反***********/ 23 /************************/ 24 ~0 = 1; 25 ~1 = 0;
置位(将某一位置为1):用1 与 该位进行 或 | 运算即可置位 --> x | 1 = 1;清位(将某一位置为0):用 0 与 该位进行 与& 运算即可清位--> x & 0 = 0;
取反 (将某一位求反): 用 1 与 该位进行 异或 ^ 运算即可取反 --> X ^ 1 = ~X;
例如:
int var = 0xFFEC2468;
1 、将var中的第3、 15、 16、 22位清位.
var &= ~( (0x1 << 2) | (0x1 << 14) | (0x1 << 15) | (0x1 << 21) );
2、 将var中的第1、14 、 17、 28位置位.
var |= ( (0x1 | (0x1 << 13) | (0x1 << 16) | (0x1 << 27) );
3、 将var中的第2、 9、 11、 29位取反。
任何位与1进行异或可取反, 任何位与0进行异或则可保持不变。
var ^= ( (0x1 << 1) | (0x1 << 8) | (0x1 << 10) | (0x1 << 28) );
深圳宝安华美居

浙公网安备 33010602011771号