標題又臭又長又難懂,所以容我簡單解釋一下。有在做電子購物網站,多少都會碰到購物車的問題,當一台購物車有十件商品,這十件商品能夠用信用卡分期的期數通常不會相同。所以要找出這十件商品的共同分期數且顯示在前端,並不是件容易的事。
以前的經驗是,同事利用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);
}使用這樣的方式,不但程式碼較簡單,再來就是位元運算是很有效率的,有類似的需求大家可以參考看看。
文章標籤
全站熱搜
