之前学习redis时,深刻的体会到了位运算的巧妙,现在和大家一起来分享一下
使用位图法统计活跃用户
首先假设我们一共统计32个用户是否连续登陆一个周,那么我们可以使用32个bit位分别代表这个32个用户来进行判断
假设结果如下
周一 1010 1100 0100 0011 1001 0010 0100 1001
周二 0011 0001 1011 0001 1011 0111 1100 1100
周三 0011 0001 1011 0001 1011 0111 1100 1100
周四..........
这样,我们就拿到了一个周的用户登陆信息,其中为1表示用户登陆,为0表示没有登陆,最后我们再通过与运算,这样就得到了活跃的用户id。
好了,现在开始说明使用位运算来进行权限的管理
public class Permission {
public static final int Allow_SELECT =1<<0; //二进制 0001
public static final int Allow_INSERT =1<<1; // 0010
public static final int Allow_UPDATE =1<<2; // 0100
public static final int Allow_DELETE =1<<3; // 1000
private int flag;
//设置用户的权限
public void setPer(int per){
flag=per;
}
//增加用户的权限
public void enable(int per){
flag=flag|per;
}
//删除用户的权限,传入要删除的权限,进行与运算后
public void disable(int per){
flag=flag&per;
}
//判断用户的权限
public boolean isAllow(int per){
return (flag&per)==per;
}
//判断用户没有的权限
public boolean isNotAllow(int per){
return (flag&per)==0;
}
public static void main(String[] args) {
int flag=15;
Permission permission=new Permission();
permission.setPer(flag);
permission.disable(Allow_DELETE|Allow_INSERT);
System.out.println("Select ="+permission.isAllow(Allow_SELECT));
System.out.println("Update ="+permission.isAllow(Allow_UPDATE));
System.out.println("Insert ="+permission.isAllow(Allow_INSERT));
System.out.println("Delete ="+permission.isAllow(Allow_DELETE));
}
}
这样就完成了