異或運算、與運算、或運算 運用在 多項選擇題
阿新 • • 發佈:2019-01-03
原文:
異或運算、與運算、或運算 運用在 多項選擇題
背景
當我們有個需求,有一個多項選擇題的答案儲存到資料庫。
我們按照一般的思維,就是做多幾個欄位去存這些多項選這題。
例子
例如:
有一個多項選擇題,
問題:你覺得廣東哪些城市好玩?
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
其他選項以此類推。