关于位操作处理
今天遇到一个小问题,位操作。
也就是说一个字段,比如说频道,频道A为1,频道B为2,频道C为4,频道D为8,频道E为16
某解说员同时在A、B、D三个频道都有工作,也就是说他的频道值就为1+2+8=11,今天从数据库里取出来判断他是否属于某个频道就是我的困扰,下面就是解决例子
package com.neusoft.dxz.module.user.mapper;
import com.google.common.collect.Lists;
import com.neusoft.features.enums.ChannelEnum;
import java.util.List;
public class ss {
// DB中用户表的Channel字段
// `channel` int(11) NOT NULL DEFAULT 0 COMMENT '所属频道(1:语培 2:留学 4:移民... 位操作)',
/**
* 这是从用户表读取的,假设为6,即有留学、移民两个频道的权限
*/
private static Integer channel = 6;
public static void main(String[] args) {
// 是否有语培频道权限
System.out.println(hasChannelAuth(ChannelEnum.LANGUAGE.value()));
// 是否有留学频道权限
System.out.println(hasChannelAuth(ChannelEnum.ABROAD.value()));
// 是否有移民频道权限
System.out.println(hasChannelAuth(ChannelEnum.IMMIGRANT.value()));
// 获取有权限的全部频道列表
System.out.println(allAuth());
}
/**
* 判断是否有某个频道的权限
* @param c
* @return 有权限/无权限
*/
private static boolean hasChannelAuth(Integer c){
return (c & channel) == c;
0 00000;
1 00001;
2 00010;
4 00100;
8 01000;
6 0110;
20 10100;
}
/**
* 获取有权限的所有频道列表(文字)
* @return 频道列表(文字)
*/
private static List<String> allAuth() {
List<String> auths = Lists.newArrayList();
for (ChannelEnum e : ChannelEnum.values()) {
// 循环频道枚举,与数据库获取的权限做与操作,判断是否有相关频道权限
if ((e.value() & channel) == e.value()) {
auths.add(e.name());
}
}
return auths;
}
}