思考:
1、 如何将一个数据中的多个不连续位清位?
1、 如何将一个数据中的多个不连续位置位?
1、 如何反转一个数据中的多个不连续位(1->0, 0->1)?
基础知识:C 语言位操作
按位或(有1得1): | | 按位与(有0得0): & | 按位异或(不同得1): ^ | 按位取反: ~ |
0 | 0 = 0 | 0 & 0 = 0 | 0 ^ 0 = 0 | ~0 = 1 |
0 | 1 = 1 | 0 & 1 = 0 | 0 ^ 1 = 1 | ~1 = 0 |
1 | 0 = 1 | 1 & 0 = 0 | 1 ^ 0 = 1 | |
1 | 1 = 1 | 1 & 1 = 1 | 1 ^ 1 = 0 |
清位(将某一位置为0):用 0 与 该位进行 与& 运算即可清位--> x & 0 = 0;
置位(将某一位置为1):用1 与 该位进行 或 | 运算即可置位 --> x | 1 = 1;
取反 (将某一位求反): 用 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) );
原文:http://www.cnblogs.com/tid-think/p/5132145.html