1. 程式人生 > >java 位運算 應用於 多個狀態維護

java 位運算 應用於 多個狀態維護

通過 <<  |  & ~ 位運算,實現同時擁有多個狀態

通過 << 定義資料的狀態

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 0001 
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狀態 扣除了