標題又臭又長又難懂,所以容我簡單解釋一下。有在做電子購物網站,多少都會碰到購物車的問題,當一台購物車有十件商品,這十件商品能夠用信用卡分期的期數通常不會相同。所以要找出這十件商品的共同分期數且顯示在前端,並不是件容易的事。

以前的經驗是,同事利用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);
            }

使用這樣的方式,不但程式碼較簡單,再來就是位元運算是很有效率的,有類似的需求大家可以參考看看。

arrow
arrow
    全站熱搜

    卑微研究生 發表在 痞客邦 留言(0) 人氣()