转载请注明:转自http://newliferen.github.io/ 参考文章:http://my.oschina.net/pangzhuzhu/blog/301828
工作几年之后,大学学过的数字电路与、或、非、异或等位运算忘的差不多了,这里使用位运算模拟linux操作系统权限,复习一下位运算。
实现思路
设定“增加”、“删除”、”更新”权限的十进制表示分别为3、4、5,设置基数base为2(其他数字也可以,但是需要限定在一定范围内);
权限对应的二进制位为1时,表示当前用户拥有对应权限。
赋权限时,执行”|”或操作,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,表示用户取得了对应的权限;
删除权限时,先将权限对应的十进制数取反,此时权限位为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,这样用户对应的权限即被删除;
查看用户是否有某些权限时,思路大致一样。
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; return permission; } public static int delPermission (int permission, int operate ) { int per = base <<operate; per = ~per; return permission & per; } public static boolean hasPermission (int permission, int operate ) { int per = base <<operate; return (permission & 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); } }