Java星期复选算法

http://my.oschina.net/zhibuji/blog/84301


//设置星期day从0到6,0是星期一 
//从Android闹钟源码中看到的,突然感觉自己特别呆,从来没用过位移啊,与或啊。这个算法利用位移比我以前写的要高效多了,拿出来学习一下,顺便告诉自己要善于运用以前学过的知识。提高代码效率,改善时间复杂度和空间复杂度。
int mDays = 0;//作为星期几的标识,0是空,1是星期1,10是星期二,11是星期一和星期二两天
public void set(int day, boolean set) {

            if (set) {
                mDays |= (1 << day);
            } else {
                mDays &= ~(1 << day);
            }
        }
private boolean isSet(int day) {
            return ((mDays & (1 << day)) > 0);
        }

 public String toString() {
    int[] DAY_MAP = new int[] {
            Calendar.MONDAY,
            Calendar.TUESDAY,
            Calendar.WEDNESDAY,
            Calendar.THURSDAY,
            Calendar.FRIDAY,
            Calendar.SATURDAY,
            Calendar.SUNDAY,
        };
            StringBuilder ret = new StringBuilder();
            // no days
            if (mDays == 0) {
                retrun "";
            }
            // every day
            if (mDays == 0x7f) {
                return "每天";
            }
            // count selected days
            int dayCount = 0, days = mDays;
            while (days > 0) {
                if ((days & 1) == 1) dayCount++;
                days >>= 1;
            }
            // short or long form?
            DateFormatSymbols dfs = new DateFormatSymbols();
            String[] dayList = (dayCount > 1) ?
                    dfs.getShortWeekdays() :
                    dfs.getWeekdays();
            // selected days
            for (int i = 0; i < 7; i++) {
                if ((mDays & (1 << i)) != 0) {
                    ret.append(dayList[DAY_MAP[i]]);
                    dayCount -= 1;
                    if (dayCount > 0) ret.append(
                            ","));
                }
            }
            return ret.toString();
        }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值