Java位运算实现权限控制

转载请注明:转自http://newliferen.github.io/
参考文章:http://my.oschina.net/pangzhuzhu/blog/301828

  工作几年之后,大学学过的数字电路与、或、非、异或等位运算忘的差不多了,这里使用位运算模拟linux操作系统权限,复习一下位运算。

实现思路

  1. 设定“增加”、“删除”、”更新”权限的十进制表示分别为3、4、5,设置基数base为2(其他数字也可以,但是需要限定在一定范围内);
  2. 权限对应的二进制位为1时,表示当前用户拥有对应权限。
  3. 赋权限时,执行”|”或操作,1|0=1,0|1=1,这样既可以保证不影响原有权限,又能将新权限赋给用户,例如当前用户权限二进制位为
    0000 0000 0000 0000 0000 0000 0000 0000,为用户赋“增加”权限时,2左移3位对应的二进制为
    0000 0000 0000 0000 0000 0000 0001 0000,执行或操作,用户当前权限位
    0000 0000 0000 0000 0000 0000 0001 0000,表示用户取得了对应的权限;
  4. 删除权限时,先将权限对应的十进制数取反,此时权限位为0,其他位为1,再和用户权限对应的二进制数执行”&”与操作,这样不影响用户原有权限,并且删除目标权限。假设当前用户的权限为
    0000 0000 0000 0000 0000 0000 1101 0000,2左移3位
    0000 0000 0000 0000 0000 0000 0001 0000,按位取反为
    1111 1111 1111 1111 1111 1111 1110 1111,和用户权限二进制数进行&操作,得出结果为
    0000 0000 0000 0000 0000 0000 1100 0000,这样用户对应的权限即被删除;
  5. 查看用户是否有某些权限时,思路大致一样。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/**
* @auth zhengzhi.ren
* @date 2015/8/6.
*/

public class MyPermission {


public static int add = 3; // 增加权限十进制表示
public static int del = 4; // 删除权限十进制表示
public static int update = 5; // 更新权限十进制表示

public static int base = 2;// 该数字可以是一个范围

/**
* 增加权限
* @param permission
* @param operate
*/

public static int addPermission(int permission, int operate) {
int per = base<<operate;
permission |= per; //增加权限时使用或,可以将权限对应的二进制位的1赋值给权限变量的0
return permission;
}

public static int delPermission(int permission, int operate){
int per = base<<operate;
per = ~per; // 按位取反,取反之前的1,取反后变为0,再和权限数字进行与运算,1&0=0,1&1=1,0&1=0,这样删除对应权限,并且不影响原有权限
return permission & per;
}

public static boolean hasPermission(int permission, int operate) {
int per = base<<operate;
return (permission & per) == per; // 1&0=0;1&1=1;0&1=0; permission和per&操作之后,如果permission对应的位为1,则和per&的结果就等于per
}

public static void printPermission(int permission) {
int binaryAdd = base<<add;
int binaryDel = base<<del;
int binaryUpdate = base<<update;
System.out.println("当前用户是否有add权限:" + ((permission & binaryAdd) == binaryAdd));
System.out.println("当前用户是否有del权限:" + ((permission & binaryDel) == binaryDel));
System.out.println("当前用户是否有update权限:" + ((permission & binaryUpdate) == binaryUpdate));
}

public static void main(String[] args) {
System.out.println(base);
int permission = 0;
System.out.println("是否有增加权限:" + hasPermission(permission, add));
// 赋权-增加权限
permission = MyPermission.addPermission(permission, add);
System.out.println("是否有增加权限:" + hasPermission(permission, add));
// 赋权-删除权限
permission = MyPermission.addPermission(permission, del);
System.out.println("是否有删除权限:" + hasPermission(permission, del));
// 解除权限
permission = MyPermission.delPermission(permission, add);
System.out.println("是否有增加权限:" + hasPermission(permission, add));
// 赋权-更新权限
permission = MyPermission.addPermission(permission, update);
System.out.println("是否有更新权限:" + hasPermission(permission, update));

// 查看用户有哪些权限
printPermission(permission);
}


}