1. 程式人生 > >異或運算、與運算、或運算 運用在 多項選擇題

異或運算、與運算、或運算 運用在 多項選擇題

原文: 異或運算、與運算、或運算 運用在 多項選擇題

 

背景

當我們有個需求,有一個多項選擇題的答案儲存到資料庫。

我們按照一般的思維,就是做多幾個欄位去存這些多項選這題。

 

例子

例如:

有一個多項選擇題,

問題:你覺得廣東哪些城市好玩?

A.東莞市

B.廣州市

C.中山市

D.珠海市

E.茂名市

F.深圳市

按照一般思維,我們在資料庫中設計6個欄位,A/B/C/D/E/F,然後儲存在資料庫,誰選擇了A,就把A對應的欄位值存入資料庫。

比如,我選擇了B/C/D,表資料如下:

  FieldA FieldB FieldC FieldD FieldE FieldF  
  0 1 1 1 0 0  

這樣雖然清楚,但是浪費表資源的同時,當資料量多,造成查詢資料低下的效果。

異或

下面,我們來介紹,如何用異或來存多項選擇題。

我們首先定義選擇題答案的列舉:

   //城市列舉
    public enum CityPlay
    {
        DongGuang = 1 << 0,//東莞
        GuangZhou = 1
<< 1,//廣州 ZhongShan = 1 << 2,//中山 ZhuHai = 1 << 3,//珠海 MaoMing = 1 << 4,//茂名 ShenZheng = 1 << 5//深圳 }

在表中,我們只存一個欄位(整型)

Field

如果,選擇了B/C/D,做B/C/D的按位或運算,存入資料庫:

CityPlay.GuangZhou | CityPlay.ZhongShan | CityPlay.ZhuHai

值等於14,存入資料庫。

那我們怎麼知道使用者選擇了哪幾個題呢?

很簡單,做或運算,

比如是否選擇了B? 很簡單,把值與B的列舉做一次按位與運算,等於0就是沒選擇,其餘選擇
CityPlay.GuangZhou & 14 == 0? N:Y

 

其他選項以此類推。