java 位運算 應用於 多個狀態維護
阿新 • • 發佈:2019-01-31
通過 << | & ~ 位運算,實現同時擁有多個狀態
通過 << 定義資料的狀態
public interface LogConstants {
/**
* 消耗標記
*/
short COST_ASSET = 1 << 0;
short COST_GOLD = 1 << 1;
short COST_BINDGOLD = 1 << 2;
short COST_SOPH = 1 << 3;
short COST_STRSOUL = 1 << 4;
short COST_REFSOUL = 1 << 5;
short COST_SOULSTONE = 1 << 6;
short COST_AAMHID = 1 << 7;
COST_GOLD = 1 << 1 位為: 0000 0010
COST_BINDGOLD = 1 << 2位為: 0000 0100
COST_SOPH = 1 << 3位為: 0000 1000
COST_STRSOUL = 1 << 4位為: 0001 0000
... ...
1--在不同的一個位上顯示;就表示一個狀態;
以上就有 九個狀態;
通過 |= 加入多個狀態
short mark = 0; -- 標誌現在擁有的狀態;
int costSoph = channel.getSoph();
if (costSoph > 0) {
mark |= LogConstants.COST_SOPH;
}
if (costGold > 0) {
mark |= LogConstants.COST_GOLD;
}
現在就表示 mark 已經擁有了 LogConstants.COST_SOPH , LogConstants.COST_GOLD兩個狀態;
因為第一次 執行 mark |= LogConstants.COST_SOPH
0000 0000 | 0000 1000 = 0000 1000 = mark;
然後再次執行 mark |= LogConstants.COST_GOLD;
0000 1000 | 0000 0010 = 0000 1010 = mark;
所有mark 在兩個為 已經標誌位1 ; 表示其擁有了兩個狀態;
通過 (m & LogConstants.COST_ASSET) > 0 判斷是否擁有該狀態
通過 m = (short) (m & ~LogConstants.COST_ASSET);扣除該狀態
最後我們需要 知道 mark擁有哪些狀態:可以執行如下:
mark & COST_ASSET = 0000 1010 & 0000 0001 = 0000 0000 沒有一個位標誌 為1 ; 所以mark沒用擁有COST_ASSET狀態;
mark & COST_GOLD = 0000 1010 & 0000 0010 = 0000 0010 = COST_GOLD 結果與COST_GOLD一致 ; 所以mark擁有COST_GOLD狀態;
mark = mark & ~LogConstants.COST_GOLD = 0000 1010 & 1111 1101 = 0000 1000 ; 這樣mark 就可以把擁有的COST_GOLD狀態 扣除了
通過 << 定義資料的狀態
public interface LogConstants {
/**
* 消耗標記
*/
short COST_ASSET = 1 << 0;
short COST_GOLD = 1 << 1;
short COST_BINDGOLD = 1 << 2;
short COST_SOPH = 1 << 3;
short COST_STRSOUL = 1 << 4;
short COST_REFSOUL = 1 << 5;
short COST_SOULSTONE = 1 << 6;
short COST_AAMHID = 1 << 7;
short COST_REALM = 1 << 8;
}
其實可以這樣理解更加形象:
COST_ASSET = 1 << 0 位為: 0000 0001COST_GOLD = 1 << 1 位為: 0000 0010
COST_BINDGOLD = 1 << 2位為: 0000 0100
COST_SOPH = 1 << 3位為: 0000 1000
COST_STRSOUL = 1 << 4位為: 0001 0000
... ...
1--在不同的一個位上顯示;就表示一個狀態;
以上就有 九個狀態;
通過 |= 加入多個狀態
short mark = 0; -- 標誌現在擁有的狀態;
int costSoph = channel.getSoph();
if (costSoph > 0) {
mark |= LogConstants.COST_SOPH;
}
if (costGold > 0) {
mark |= LogConstants.COST_GOLD;
}
現在就表示 mark 已經擁有了 LogConstants.COST_SOPH , LogConstants.COST_GOLD兩個狀態;
因為第一次 執行 mark |= LogConstants.COST_SOPH
0000 0000 | 0000 1000 = 0000 1000 = mark;
然後再次執行 mark |= LogConstants.COST_GOLD;
0000 1000 | 0000 0010 = 0000 1010 = mark;
所有mark 在兩個為 已經標誌位1 ; 表示其擁有了兩個狀態;
通過 (m & LogConstants.COST_ASSET) > 0 判斷是否擁有該狀態
通過 m = (short) (m & ~LogConstants.COST_ASSET);扣除該狀態
最後我們需要 知道 mark擁有哪些狀態:可以執行如下:
mark & COST_ASSET = 0000 1010 & 0000 0001 = 0000 0000 沒有一個位標誌 為1 ; 所以mark沒用擁有COST_ASSET狀態;
mark & COST_GOLD = 0000 1010 & 0000 0010 = 0000 0010 = COST_GOLD 結果與COST_GOLD一致 ; 所以mark擁有COST_GOLD狀態;
mark = mark & ~LogConstants.COST_GOLD = 0000 1010 & 1111 1101 = 0000 1000 ; 這樣mark 就可以把擁有的COST_GOLD狀態 扣除了