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

 

posted @ 2016-01-15 01:05  mcdull^0^  阅读(236)  评论(0)    收藏  举报