如何用Integer儲存多選單資訊?
由於身邊許多寫程式的朋友都不是資訊系,
每次遇到這種寫法都需要另外解釋一次,
於是乎乾脆寫篇文章記錄下來囉!
假設我們要記錄這個人喜歡吃哪些水果?
選項有:蘋果、香蕉、芭樂、橘子
注意,這裡的選項必須是固定的,且未來不會增加或減少,才適用此方法!
Step 1 了解二進位
我們知道,電腦儲存資料的方式是以二進位來儲存,也就是0和1的世界
所以在這裡我們打算用1個bit來儲存一種水果的資料
第1個bit,用來記錄蘋果
=> 0001
第2個bit,用來記錄香蕉
=> 0010
第3個bit,用來記錄芭樂
=> 0100
第4個bit,用來記錄橘子
=> 1000
然後寫成列舉,就像這樣:
1 | public enum Fruit { |
Step 2 如何儲存
那麼假設小明喜歡蘋果和芭樂,如下
- 蘋果
- 香蕉
- 芭樂
- 橘子
那們我們就記錄成 0101
,用十進位來看也就是 1+4=5
所以我們在資料庫裡面只要存5
,就可以知道小明勾選了蘋果
和芭樂
十進位 | 二進位 |
---|---|
5 | 0101 |
反之,如果我們資料庫裡的數值是6
,那代表勾選哪些水果呢?
馬上轉二進位看一下:
十進位 | 二進位 |
---|---|
6 | 0110 |
於是我們就知道,6
代表的是香蕉
和芭樂
Step 3 如何用程式處理
如果我們要儲存選項,很簡單,只要把被選中項目的列舉數字相加即可。
但如果從資料庫取出一個數字,我們該如何解回選項呢?
這時我們會用到邏輯設計中的 And 方法,我們先來看看真實表:
And | 0 | 1 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
從真實表中,我們可以看出,兩個都為1的時候,才會得到1
假設我們從資料庫中取出 7 這個數字
我們要知道 7 有沒有包含蘋果
十進位 | 二進位 |
---|---|
7 | 0111 |
1 (蘋果) | 0001 |
做AND運算後 | 0001 |
看出來了嗎?因為蘋果的二進位,除了第1個bit,其他bit都是0,所以其他bit不管怎麼做 And 運算都會是0
所以我們只要做完And運算 > 0
,表示有被選中, = 0
代表沒被選中
寫成程式如下:
1 | int fruit_likes = 7; |
最後要注意的是,通常我們一個 int 只有 32bit 的大小,所以最多也只能存32個選項,
但通常應該不會這麼多啦,真的這麼多的話使用者也太辛苦了。
END
街口支付
街口帳號: 901061546