当前位置: 首页 > article >正文

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

文章目录

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

1、常用位运算

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

2、使用场景

功能示例位运算
位运算实现乘除法将x左移一位实现×2,将x右移一位实现÷2a<<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


http://www.kler.cn/news/10566.html

相关文章:

  • 熟练了Flex布局之后,该学学Grid布局了
  • 前端项目-12-个人中心-二级路由配置-导航守卫-懒加载
  • Linux常见操作命令【三】
  • 算法模板(2):数据结构(3) 复杂数据结构1
  • Java14新特性
  • sql server存储过程
  • Java------Stream流式编程高级API【groupingBy、flatMap】(六)
  • 记2023第十四届蓝桥杯感受
  • 初识linux之线程控制
  • (二十三)槽函数的书写规则导致槽函数触发2次的问题
  • Microsoft Intune部署方案
  • 为pip永久性添加国内镜像安装源
  • 44.节流与防抖
  • JavaScript函数
  • android ndk 编译 libevent
  • setInterval 让它刚进页面时执行一次,然后根据设置的间隔时间执行;clearInterval清除setInterval。
  • webgl-根据鼠标点击而移动
  • linux对动态库的搜索知识梳理
  • 推荐 ChatGpt 平替介绍文章
  • TensorFlow 机器学习秘籍第二版:6~8
  • 常见网络协议汇总(一)
  • 前端手写综合考题
  • DS-NeRF代码
  • 【SpringMVC】SpringMVC注解式开发
  • ChatGPT实现用C语言写一个学生成绩管理系统
  • 阻塞/非阻塞、同步/异步、五种IO模型
  • SpringBoot基础配置
  • Spring相关概念
  • 2.28、共享内存(1)
  • springboot如何优雅的打印项目日志