0%

如何用1個Integer儲存多選單資訊?

如何用Integer儲存多選單資訊?

由於身邊許多寫程式的朋友都不是資訊系,
每次遇到這種寫法都需要另外解釋一次,
於是乎乾脆寫篇文章記錄下來囉!

假設我們要記錄這個人喜歡吃哪些水果?
選項有:蘋果、香蕉、芭樂、橘子

注意,這裡的選項必須是固定的,且未來不會增加或減少,才適用此方法!

Step 1 了解二進位

我們知道,電腦儲存資料的方式是以二進位來儲存,也就是0和1的世界
所以在這裡我們打算用1個bit來儲存一種水果的資料

第1個bit,用來記錄蘋果 => 0001
第2個bit,用來記錄香蕉 => 0010
第3個bit,用來記錄芭樂 => 0100
第4個bit,用來記錄橘子 => 1000

然後寫成列舉,就像這樣:

1
2
3
4
5
6
public enum Fruit {
蘋果 = 1, // 0001
香蕉 = 2, // 0010
芭樂 = 4, // 0100
橘子 = 8 // 1000
}

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
2
3
4
5
6
7
8
int fruit_likes = 7;
foreach (Fruit fruit in Enum.GetValues(typeof(Fruit)))
{
if((fruit_likes & (int)fruit) > 0)
{
Console.Write(fruit.ToString()); // 印出有被選到的水果
}
}

最後要注意的是,通常我們一個 int 只有 32bit 的大小,所以最多也只能存32個選項,
但通常應該不會這麼多啦,真的這麼多的話使用者也太辛苦了。

END

↓↓↓ 如果喜歡我的文章,可以幫我按個Like! ↓↓↓
>> 或者,請我喝杯咖啡,這樣我會更有動力唷! <<<
街口支付

街口支付

街口帳號: 901061546

歡迎關注我的其它發布渠道