先举个例子说明一下
就比如使用红包的时候,如果要让它只有在周一到周五才能使用。首先想到的是不就是服务器端弄个数组,数据库弄个子表就行了吗?
但是组长告诉我不这么做,要用二进制算法去做@_@
用二进制的7位数代表一周的每一天
1111111 //全天可用(127)
0000000 //全天不能用(0)
也就是说数据库里就存一个0到127的数字
哪一天代表哪位数可以随便定义。
这想法还是头一次见,感觉有点意思(☆_☆)
首先,定义如下:
private static Map<Integer,String> weekMap=new HashMap<Integer, String>(8);
static{
weekMap.put(0, "周天");
weekMap.put(1, "周一");
weekMap.put(2, "周二");
weekMap.put(3, "周三");
weekMap.put(4, "周四");
weekMap.put(5, "周五");
weekMap.put(6, "周六");
}
这里周天就代表2的0次方 //0000001
周一代表2的1次方 //0000010
周二代表2的2次方 //0000100
周三代表2的3次方 //0001000
…
具体实现代码如下:
@Test
public void demo() {
//参数
Integer parameter=2;
if(!weekMap.containsKey(parameter)) {
throw new RuntimeException("参数异常");
}
int week=1<<parameter;
Calendar cal=Calendar.getInstance(); //获取日历对象
cal.setTime(new Date()); //设置日历时间
int i = cal.get(Calendar.YEAR); //获取日历当前年份
int j = cal.get(Calendar.MONTH); //获取日历当前月份(从0开始)
int k = cal.get(Calendar.DATE); //获取日历当前日期
int l = cal.get(Calendar.HOUR_OF_DAY);//获取日历当前小时(24小时制)
int m = cal.get(Calendar.AM_PM); //获取日历当前是上午还是下午
int n = cal.get(Calendar.DAY_OF_WEEK);//获取日历当前周几(周天为1,周一为2,所以下面要-1)
System.out.println(i+"年"+(j+1)+"月"+k+"日"+"周"+(n-1)+(m==0?"上午":"下午")+l+"点");
if((week>>(n-1))%2>0) {
System.out.println("可以使用");
}else {
System.out.println("无法使用");
}
}
打印的结果是:
2022年1月11日周2下午16点
可以使用
分析一下
关键的在于(week>>(n-1))%2>0
比如周二是0000100
向右移个两位就变成了0000001
求余2是不是就多出来了个1
实际上week就是1向左移两位得出来的,再向右移不就变回来了
如果要多选的话也只要改一个地方
@Test
public void demo() {
//参数
Integer[] parameter=new Integer[] {1,3,4};
for(Integer data : parameter) {
if(!weekMap.containsKey(data)) {
throw new RuntimeException("参数异常");
}
}
int week=(1<<parameter[0])+(1<<parameter[1])+(2<<parameter[2]);
Calendar cal=Calendar.getInstance(); //获取日历对象
cal.setTime(new Date()); //设置日历时间
int i = cal.get(Calendar.YEAR); //获取日历当前年份
int j = cal.get(Calendar.MONTH); //获取日历当前月份(从0开始)
int k = cal.get(Calendar.DATE); //获取日历当前日期
int l = cal.get(Calendar.HOUR_OF_DAY);//获取日历当前小时(24小时制)
int m = cal.get(Calendar.AM_PM); //获取日历当前是上午还是下午
int n = cal.get(Calendar.DAY_OF_WEEK);//获取日历当前周几(周天为1,周一为2,所以下面要-1)
System.out.println(i+"年"+(j+1)+"月"+k+"日"+"周"+(n-1)+(m==0?"上午":"下午")+l+"点");
if((week>>(n-1))%2>0) {
System.out.println("可以使用");
}else {
System.out.println("无法使用");
}
}
打印结果:
2022年1月11日周2下午16点
无法使用
最后
有兴趣的小伙伴可以多拿来测试测试,如果有问题随时可以在下方的评论发表意见<( ̄︶ ̄)>