常用位运算和二进制做权限管理

文章目录

  • 1、常用位运算
  • 2、使用场景
  • 3、使用位运算进行权限设置(路由或文件权限)
    • 3.1 作为路由管理

1、常用位运算

符号 描述 运算规则(比较的是二进制) 实例(以四位二进制数为例)
& 两个位都为1时,结果才为1 0001&0001=1,0001&0000=0,0000&0000=0000
| 两个位都为0时,结果才为0 0001|0001=0001,0001|0000=0001,0000|0000=0000
^ 异或 两个位相同为0,相异为1 0001∧0001=0000,0001∧0000=1,0000∧0000=0
~ 取反 0变1,1变0 ∼0=1,∼1=0
<< 左移 各二进位全部左移若干位,高位丢弃,低位补0 0001<<2=0100
>> 右移 各二进位全部右移若干位,对无符号数,高位补0,有符号数,右移补1 0100>>2=0001

2、使用场景

功能 示例 位运算
位运算实现乘除法 将x左移一位实现×2,将x右移一位实现÷2 a<<1,a>>1
位运算交换两整数 void swap(int &a,int &b){
a ^= b;
b ^= a;
a ^= b;
}
对于a = a ∧ b,则b = b ∧ ( a ∧ b ),根据交换律以及异或性质,得b = b ∧ b ∧ a = 0 ∧ a = a,同理a = ( a ∧ b ) ∧ a = 0 ∧ b = b
位运算判断奇偶数 在二进制中,最低位决定了是奇数还是偶数,所以我们可以提取出最低位的值,即与1相与即可实现目的,为0则是偶数,为1则是奇数 a&1

3、使用位运算进行权限设置(路由或文件权限)

位运算是一种用于处理二进制数据的运算方式,它可以用来进行权限管理,具有以下优点:

  1. 空间效率高:位运算可以用较少的二进制位来表示权限,从而节省存储空间。例如,一个32位的整数可以表示32个不同的权限值,而不需要使用32个单独的布尔值。
  2. 运算速度快:位运算是计算机底层的操作,执行速度非常快,因为它可以使用硬件电路进行计算,而不需要像其他逻辑运算符那样进行软件计算。
  3. 简单易用:位运算符号简单易懂,逻辑也较为简单,可以通过位运算符号的组合来实现权限的控制,代码相对简洁易懂。
  4. 提高代码可读性:使用位运算可以使代码更加简洁,可读性更高,从而减少代码的复杂度,提高代码的可读性。

在Linux操作系统中,x - 可执行权限,w - 可写权限 , r - 可读权限。其权限值分别是1,2,4

​ 1,2,4 分别对应着2的幂次方(20、21 、2^2),在计算机中都是以二进制的方式进行存储,在计算时二进制的方式会更快。

​ 举个例子:如果一个人拥有读和写的权限,现在他的权限值为6,当需要判断他是否拥有写权限时,只需要用 6 和 2 进行按位与运算(6 & 2 = 2),结果非0 ,所以可以判断拥有此权限。当需要判断他是否拥有可执行权限时,同样只需要用 6 和 1 进行按位与运算 (6 & 1 = 0 ),结果为0,所以可以判断不拥有此权限。

6 & 2 = 2
00000110
& 00000010
——————----
00000010
  
又或者:6 & 1 = 0 
00000110
& 00000001
——————-----
00000000

3.1 作为路由管理

​ 对于在系统中的路由,我们假设有查看、修改、新增、删除四个controller方法来处理某个业务,我们可以设置这四个的权限值为1,2,4,8,在用户的角色表中设置角色的权限值,假如这个角色的权限值为5=(1+4),则可以说明他拥有查看新增权限,我们分别在每个接口地方配置自己的权限值,可以使用注解的方式进行设置每个接口的权限,然后使用使用拦截器,在拦截器中获取注解中的权限值进行判断当前用户角色的权限值和当前的接口的权限值进行位运算的结果,也就是5&1位非0,假如请求的接口是查看接口,也就是说明拥有此接口的权限。

​ 需要具体代码:请私信或者留言

具体参考:https://www.cnblogs.com/zhangshiwen/p/14389149.html

你可能感兴趣的:(Java,其它,java)