位运算是什么
位操作是程序设计中对位模式按位或二进制数的一元和二元操作。大部分编程语言都提供了这几种运算符:1. & 按位与 2. | 按位或 3. ^ 按位异或 4. ~ 取反 5. << 左移 6. >> 右移。位运算一般都是用整形数字来进行,浮点数二进制是由定点数跟基数组成,位运算结果没意义。
位运算的技巧使用
1.两个整数变量交换值
int main(int argc, const char * argv[]) {
int a = 10, b = 15;
printf("before swap: a=%d, b=%d", a, b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("after swap: a=%d, b=%d", a, b);
return 0;
}
相信很多程序员朋友都使用过这种方式,通过 ^ 异或运算符来实现。
2.判断一个整数的奇偶性
int main(int argc, const char * argv[]) {
int num = 5;
bool isOddNumber = (num & 1) == 1;
return 0;
}
通过判断整数二进制中的最低位是1还是0。
3.用一个整数来表示多个状态
在看Linux内核相关书籍时,发现内存的可读,可写,可执行等这些状态可以用一个整数来存储,这个很有技巧。
public static void main(String[] args) {
int NONE_STATUS = 0;
int READABLE_STATUS = 1 << 1;
int WRITEABLE_STATUS = 1 << 2;
int EXECABLE_STATUS = 1 << 3;
int mmStatus = NONE_STATUS;
mmStatus |= READABLE_STATUS;
mmStatus |= WRITEABLE_STATUS;
boolean isMmReadable = (mmStatus & READABLE_STATUS) == READABLE_STATUS;
boolean isMmWriteable = (mmStatus & WRITEABLE_STATUS) == WRITEABLE_STATUS;
boolean isMmExecable = (mmStatus & EXECABLE_STATUS) == EXECABLE_STATUS;
System.out.println("mm readable: "+isMmReadable+", writeable: "+isMmWriteable+", execable:"+isMmExecable);
// 通过取READABLE_STATUS的补码 也就是二进制中的1变为0 0变为 再进行 &运算 就可以将该位的1设为0
mmStatus &= ~READABLE_STATUS;
isMmReadable = (mmStatus & READABLE_STATUS) == READABLE_STATUS;
isMmWriteable = (mmStatus & WRITEABLE_STATUS) == WRITEABLE_STATUS;
isMmExecable = (mmStatus & EXECABLE_STATUS) == EXECABLE_STATUS;
System.out.println("mm readable: "+isMmReadable+", writeable: "+isMmWriteable+", execable:"+isMmExecable);
}
这种方式通过将二进制的每一个bit与对应的状态进行绑定,而状态也需要是2的n次幂。