@PheonixHkbxoic
2017-11-29T08:20:46.000000Z
字数 2564
阅读 1451
位运算

位运算(Bit Manipulation,也叫位操作)说穿了,就是直接对整数在内存中的二进制位进行操作。
运算符含义(来自百度):
| 含义 | Pascal语言 | C语言 | C#语言 | Java |
|---|---|---|---|---|
| 按位与 | a and b | a & b | a & b | a & b |
| 按位或 | a or b | a | b | a | b | a | b |
| 按位异或 | a xor b | a ^ b | a ^ b | a ^ b |
| 按位取反 | not a | ~a | ~a | ~a |
| 左移 | a shl b | a << b | a << b | a << b |
| 带符号右移 | a shr b | a >> b | a >> b | a >> b |
| 无符号右移 | a>>> b |
简单的说:
| 与 | 或 | 异或 | 取反 | 左移 | 右移 | 无符号右移 |
|---|---|---|---|---|---|---|
| & | | | ^ | ~ | << | >> | >>> |
优先级(可以放在最后记忆)

public class Permission {// 是否允许查询private boolean allowSelect;// 是否允许新增private boolean allowInsert;// 是否允许删除private boolean allowDelete;// 是否允许更新private boolean allowUpdate;// 省略Getter和Setter}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;}}
缺点其实很明显:
1. 不了解位运算的人可能完全看不懂;
2. 可读性差,即使对位运算相对比较了解的人 一下子也可能感觉不明所以。
含义(用法):按位与运算通常用来对某些位清0或保留某些位。
如:a&255或a&0xff,因为255的二进制为1111 1111,与的结果为a只保留低8位。
再如:a = a&(~7),因为~7为1111 1000(假如1个字节),与的结果为a的低3位置为0。
注:
含义(用法):将某些位置为1.
如:8|4 => 1000b|0100b => 1100b =>12,单看没啥用,如果用在权限上(授予权限),啧啧..
含义(用法):求出两个数的差异。
1. <<n左移n位,右补0。实际含义相当于*2^n
2. >>n右移n位,左补0.实际含义相当于/2^n
3. >>>n右移n位,正数左补0,负数取决于编译系统,一般补1
1.将expr的第n(n从0开始)位设置为1: expr |= (1<<n);2.将expr的第n(n从0开始)位设置为0: expr &= (~(1<<n));3.判断expr的第n(n从0开始)位是否为1:bool b =expr & (1<<n);4.翻转expr的第n(n从0开始)位:expr ^=(1<<n);