位運算(Bit Manipulation,也叫位操做)說穿了,就是直接對整數在內存中的二進制位進行操做。
html
優先級(能夠放在最後記憶)算法
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; } }
缺點其實很明顯:編碼
含義(用法):按位與運算一般用來對某些位清0或保留某些位。 如:a&255或a&0xff,由於255的二進制爲1111 1111,與的結果爲a只保留低8位。 再如:a = a&(~7),由於~7爲1111 1000(假如1個字節),與的結果爲a的低3位置爲0。
注:code
含義(用法):將某些位置爲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);