標題又臭又長又難懂,所以容我簡單解釋一下。有在做電子購物網站,多少都會碰到購物車的問題,當一台購物車有十件商品,這十件商品能夠用信用卡分期的期數通常不會相同。所以要找出這十件商品的共同分期數且顯示在前端,並不是件容易的事。
以前的經驗是,同事利用Dictionary物件去做統計,key是分期數,value則是用來統計該分期數有幾件商品支援,最後用兩層迴圈去統計。這個方法行得通,但就是不漂亮,而最近我就想到另一種可行的方法。
大家都知道一般的整數是32bit,每個bit都當作是一個分期,也就是說一個整數可以表示32個分期數,某個bit為0時代表沒有這個分期,反之則是有。十件商品就有十個整數,把這十個整數都做 AND 運算,最後再檢查每個bit為零或一即可。程式碼如下:
public static int ConvertPeriodsToInt(int[] periodsArray) { int bits = 1; foreach (int period in periodsArray) { if (period > 32) { throw new Exception("Period is more than 32"); } bits |= (1 << period - 1); } return bits; } public static int[] ConvertIntToPeriods(int periods) { List<int> list = new List<int>(); int period = 1; while (periods > 0) { int result = periods & 1; if (result == 1) { list.Add(period); } period++; periods = periods >> 1; } return list.ToArray(); }
第一個函式是將所有的期數轉成一個整數,第二個則是將轉換後的整數轉回整數陣列,而使用的方式如下:
int[] periodsArray = new int[] { 1, 2, 6, 12 }; int[] periodsArray2 = new int[] { 1, 3, 6, 12, 24 }; int periods = ConvertPeriodsToInt(periodsArray); periods &= ConvertPeriodsToInt(periodsArray2); foreach (var item in ConvertIntToPeriods(periods)) { Console.WriteLine(item); }
使用這樣的方式,不但程式碼較簡單,再來就是位元運算是很有效率的,有類似的需求大家可以參考看看。
全站熱搜