位运算技巧的总结
1. 位运算基础
- 与(&)两个比特位同时为1结果为1,否则为0
- 或(|)只要有一个为1结果就为1
- 非(~) 取反
- 异或(^)相同则为0,不同则为1。(像是消消乐)
- 右移(>>)不包括符号位,整体右移,左边位补0,右边舍弃。大概相当于整除2的n次方。左移反之
- 无符号右移(>>>) 包括符号位,整体右移。(-4 >>> 1 = 2147483646)
- 原、反、补码:正数:原码=反码=补码 负数:反码=原码忽略符号位取反, 补码=反码+1
2. 位运算枚举
枚举值用二进制表示,可以进行一些高效的运算,源码中较常见,实例如下:
public class NewPermission {
// 是否允许查询,二进制第1位,0表示否,1表示是
public static final int ALLOW_SELECT = 1 << 0; // 0001
// 是否允许新增,二进制第2位,0表示否,1表示是
public static final int ALLOW_INSERT = 1 << 1; // 0010
// 是否允许修改,二进制第3位,0表示否,1表示是
public static final int ALLOW_UPDATE = 1 << 2; // 0100
// 是否允许删除,二进制第4位,0表示否,1表示是
public static final int ALLOW_DELETE = 1 << 3; // 1000
// 存储目前的权限状态
private int flag;
/**
* 重新设置权限
*/
public void setPermission(int permission) {
flag = permission;
}
/**
* 添加一项或多项权限
*/
public void enable(int permission) {
flag |= permission;
}
/**
* 删除一项或多项权限
*/
public void disable(int permission) {
flag &= ~permission;
}
/**
* 是否拥某些权限
*/
public boolean isAllow(int permission) {
return (flag & permission) == permission;
}
/**
* 是否禁用了某些权限
*/
public boolean isNotAllow(int permission) {
return (flag & permission) == 0;
}
/**
* 是否仅仅拥有某些权限
*/
public boolean isOnlyAllow(int permission) {
return flag == permission;
}
}
3. 交换两个值
void exchange(int x , int y)
{
x ^= y;
y ^= x;
x ^= y;
}
4. 判断奇偶性
void test(int x)
{
if (x&1 == 0) {
printf("偶数");
} else {
printf("奇数");
}
}
5. 求平均值(避免超过int最大值溢出情况)
int average(int x, int y) //返回X,Y 的平均值
{
return (x&y)+((x^y)>>1);
}
部分摘录自 这里,更多内容请点击链接