本文首發於個人部落格:舉個栗子,需要儲存這些狀態你會怎麼設計表呢?
你可能會想,這很簡單啊,針對乙個開關加乙個狀態字段嘛~
呵呵真是太年輕,這樣開發上線後,產品又要增加新的提醒方式,如圖
難不成,再加狀態字段?
可以發現,以上這種做法,在需求改動時就會很蛋疼,而且這只是提醒的開關設定,若有其他型別的開關設定就更加麻煩。
所以這裡引入今天的主題,二進位制狀態位。
這樣資料庫只需要新增乙個整數字段儲存即可。使用2的次冪值代表一種狀態,比如使用1
(2º) 代表開啟站內提醒,2
(2¹) 代表 開啟郵件提醒,4
(2²) 代表開啟簡訊提醒等等,這樣這個狀態位字段只需要儲存6
即可表示已開啟這幾項提醒。因為 6 與這幾個狀態值進行與運算時都等於狀態值本身,如果不等於則為開啟。
首先回顧一下二進位制與位運算的基礎知識
十進位制二進位制
00000 0000
10000 0001
20000 0010
30000 0011
40000 0100
50000 0101
60000 0110
70000 0111
或運算:bit位上有1為1。例如:2 | 1 == 0000 0010 | 0000 0001 == 3
與運算:bit位都為1才為1。 例如 5 & 2 == 0000 0101 & 0000 0010 == 0
/**
* 計算狀態位
* tags: 已有狀態位
* value: 需要新增的狀態值
*/public static int addtag(int tags, int... values)
return tags;
}
現在判斷是否開啟了站內提醒
5 & 1 == 0000 0101 & 0000 0001 == 1
/**
* 是否包含狀態位
* tags: 已有狀態位
* value: 需要判斷的狀態值
*/public static boolean hastag(int tags, int value)
現在要關閉站內提醒
5 ^ 1 == 0000 0101 ^ 0000 0001 == 4
/**
* 移除狀態位
* tags: 已有狀態位
* value: 需要移除的狀態值
*/public static int deltag(int tags, int value)
測試:
public static void main(string args)
在日常開發中,這些狀態可以通過列舉值進行封裝起來,方便使用。
@getter
public enum notifytypeenum
public boolean hastag(int tags)
public static void main(string args)
}
二進位制位運算
與運算,6 3 2 或運算 6 3 7 異或運算 6 3 5 反碼 6 7 左移 3 2 12 3 2 2 12 右移 3 1 1 3 2 1 無符號右移 3 1 1 3 2 1 按位與,當兩位同時為1時才為1如 1 1 1 1 0 0 0 1 0 6 3相當於 0110 0011 0010 2 按...
更新二進位制位
問題描述 給出兩個32位的整數n和m,以及兩個二進位制位的位置i和j。寫乙個方法來使得n中的第i到j位等於m m會是n中從第i為開始到第j位的子串 日期 2017 8 22 思路 由於題目的提示中已經給出,i到j有足夠的空間放置m,將n中的第i到j之間的數字全部置為0,最後與m異或即可 includ...
二進位制位運算
一 按位與 位全為1,結果才為1 0 0 0 0 1 0 1 0 0 1 1 1 特殊用法 清零。如果想將乙個單元清零,就是使其全部二進位制位為0,只要與乙個各位都為零的數值相與,結果為零 取乙個數中的指定位。如x 10101110要取x的低4位,用x 00001111 00001110即可 二 按...