專案二進位製標位實戰應用

2022-08-03 17:39:14 字數 1684 閱讀 6656

本文首發於個人部落格:

舉個栗子,需要儲存這些狀態你會怎麼設計表呢?

你可能會想,這很簡單啊,針對乙個開關加乙個狀態字段嘛~

呵呵真是太年輕,這樣開發上線後,產品又要增加新的提醒方式,如圖

難不成,再加狀態字段?

可以發現,以上這種做法,在需求改動時就會很蛋疼,而且這只是提醒的開關設定,若有其他型別的開關設定就更加麻煩。

所以這裡引入今天的主題,二進位制狀態位。

這樣資料庫只需要新增乙個整數字段儲存即可。使用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即可 二 按...