setBit testBit权限管理(shiro项目中来的二)
一,setBit testBit权限管理的理解
1.1、jdk7文档解释
public boolean testBit(int n)
Returns true if and only if the designated bit is set. (Computes((this & (1<<n)) != 0).)
Parameters:
n - index of bit to test.
Returns:
true if and only if the designated bit is set.
Throws:
ArithmeticException -n is negative.
翻译:
当且仅当指定的位被设置时返回true。
1.2,代码
public class TestBit {
public static void main(String[] args) {
BigInteger bi = new BigInteger("12");
//testBit 的判断条件为((this & (1<<n)) != 0
System.err.println("Test Bit on " + bi + " at index 1 returns "+bi.testBit(1));
System.err.println("Test Bit on " + bi + " at index 2 returns "+bi.testBit(2));
System.err.println("Test Bit on " + bi + " at index 3 returns "+bi.testBit(3));
System.err.println("Test Bit on " + bi + " at index 4 returns "+bi.testBit(4));
//12 的二进制表示为1100
//1 的二进制表示为0001 ,1<<1 为00000010, (this & (1<<1))为0,bi.testBit(1)为FALSE
//2 的二进制表示为0010 ,1<<2 为00000100, (this & (1<<2))为4,bi.testBit(2)为true
//3 的二进制表示为0011 ,1<<3 为00001000, (this & (1<<3))为8,bi.testBit(3)为true
//4 的二进制表示为0100 ,1<<4 为00010000, (this & (1<<4))为0,bi.testBit(4)为FALSE
}
}

Test Bit on 12 at index 0 returns FALSE
因为1<<0 还是1。
1.3,java基础解释
& 既是位运算符又是逻辑运算符,&的两侧可以是int,也可以是boolean表达式,当&两侧是int时,要先把运算符两侧的数转化为二进制数再进行运算。
①12&5 的值是多少?答:12转成二进制数是1100(前四位省略了),5转成二进制数是0101,则运算后的结果为0100即4 这是两侧为数值时;
② 若 int i = 2,j = 4;则(++i=2)&(j++=4)的结果为false,其过程是这样的:先判断++i=2是否成立,这里当然是不成立了(3 == 2),但是程序还会继续判断下一个表达式是否成立,j++=4 ,该表达式是成立的,但是&运算符要求运算符两侧的值都为真,结果才为真,所以(++i=2)&(j++=4)的结果为 false
<< 移位运算符就是在二进制的基础上对数字进行平移。按照平移的方向和填充数字的规则分为三种:<<(左移)、>>(带符号右移)和>>>(无符号右移)。
比如
3 << 2 过程是0011 ----》 1100
上面代码中已经解释了
//12 的二进制表示为1100
//1 的二进制表示为0001 ,1<<1 为00000010, (this & (1<<1))为0,bi.testBit(1)为FALSE
//2 的二进制表示为0010 ,1<<2 为00000100, (this & (1<<2))为4,bi.testBit(2)为true
//3 的二进制表示为0011 ,1<<3 为00001000, (this & (1<<3))为8,bi.testBit(3)为true
//4 的二进制表示为0100 ,1<<4 为00010000, (this & (1<<4))为0,bi.testBit(4)为FALSE
这里说一下&,当1100&0010时,二进制每一位上的数与操作,都为1时得1,其他情况为0,所以1100&0010为0000
1.4,setBit 的原理
BigInteger bi = new BigInteger("12");
bi =bi.setBit(2);
bi =bi.setBit(4);
bi的值将是12+2^5 =28
jdk解释:
public BigInteger setBit(int n)
Returns a BigInteger whose value is equivalent to this BigInteger with the designated bit set.- (Computes
(this | (1<<n)).)
12的二进制为00001100,
12|(1<<2)为1100|0100=1100,所以12|(1<<2)为12
12|(1<<4)为1100|0001000=00011100,12|(1<<4)为28
二,项目中的应用
2.1,testBit
public static BigInteger sumRights(String[] rights){
BigInteger num = new BigInteger("0");
for(int i=0; i<rights.length; i++){
num = num.setBit(Integer.parseInt(rights[i]));
}
return num;
}
在这里会把
[1, 2, 36, 37, 39, 38, 43, 20, 3, 40, 41]
0+2的2次方+2的36次方+2的37次方。。。。。
13125421105166
算出来一个值赋给num,并存到数据库中
2.2,testBit
public static boolean testRights(BigInteger sum,int targetRights){
return sum.testBit(targetRights);
}
在这里会把从数据库中取到的值sum13125421105166通过testBit这个方法,因为这个值是通过上面的方法来的,现在通过testBit这个方法假如在[1, 2, 36, 37, 39, 38, 43, 20, 3, 40, 41]这几个数中则返回true,否则则返回false。
setBit testBit权限管理(shiro项目中来的二)的更多相关文章
- setBit testBit权限管理
1.jdk7文档解释 public boolean testBit(int n) Returns true if and only if the designated bit is set. (Com ...
- 权限的分类(shiro项目中来的五)
第一种权限:菜单栏展示还是不展示的权限(粗颗粒) 实现方法,在SYS_ROLE表中添加一个字段rights,通过 public static BigInteger sumRights(String[] ...
- 【基于url权限管理 shiro(一)】--基础
只要有用户参与的系统一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源.权限管理包括用户认证和授权两部分. 用户认证 1.概 ...
- 《shiro》视频目录---1、权限管理-shiro
\day01_shiro\0323\10realm支持散列.avi;\day01_shiro\0323\1权限管理原理.avi;\day01_shiro\0323\2权限管理解决方案.avi;\day ...
- 在UniApp的H5项目中,生成二维码和扫描二维码的操作处理
在我们基于UniApp的H5项目中,需要生成一些二维码进行展示,另外也需要让用户可以扫码进行一定的快捷操作,本篇随笔介绍一下二维码的生成处理和基于H5的扫码进行操作.二维码的生成,使用了JS文件wea ...
- vue项目中批量打印二维码
前提:项目中要打印的二维码为后台返回,批量选择后,点击打印,先打开二维码预览界面,再执行打印. 以下代码中 codePicList为选中的二维码数组.重点css:page-break-after:al ...
- 关于写SpringBoot+Mybatisplus+Shiro项目的经验分享二:问题1
框架: SpringBoot+Mybatisplus+Shiro 简单介绍:关于写SpringBoot+Mybatisplus+Shiro项目的经验分享一:简单介绍 添加时,如果失败,不能正确跳转 c ...
- springboot+mybatis+shiro项目中使用shiro实现登录用户的权限验证。权限表、角色表、用户表。从不同的表中收集用户的权限、
要实现的目的:根据登录用户.查询出当前用户具有的所有权限.然后登录系统后.根据查询到的权限信息进行不同的操作. 以下的代码是在搭好的框架之下进行的编码. 文章目录 核心实现部分. 第一种是将用户表和角 ...
- 页面某些特定图标的权限,比如导入导出表格,下载等等,这个权限必须在有某个页面查看的权利的基础上(细粒度)(shiro项目中来的四)
一,查找按钮权限的设置 第一步:会根据用户的相关信息去查到它的角色表: SELECT * FROM SYS_USER WHERE user_id='eded77bdf35347249b2bacfa18 ...
随机推荐
- 洛谷 [P2756] 飞行员配对方案问题 网络流实现
网络流实现二分图匹配 对于x集合的每一个点连一条从源点出发的容量为一的边,对于y集合的每一个点连一条到汇点的容量为一的边,跑最大流 #include <iostream> #include ...
- BZOJ 3270: 博物馆 [概率DP 高斯消元]
http://www.lydsy.com/JudgeOnline/problem.php?id=3270 题意:一张无向图,一开始两人分别在$x$和$y$,每一分钟在点$i$不走的概率为$p[i]$, ...
- js中的this和箭头函数中的this
一.ES6 允许使用"箭头"(=>)定义函数. // var f = v => v;// 上面的箭头函数等同于: // var f = function(v) {// ...
- 一个Dotnet数据框架的bug
好久没写C#代码了,今天在维护公司老项目时,偶然发现一个BUG.记录一下,后面的同学就不要踩坑啦. -------------------------------------------------- ...
- Hot Research Topics
- maven项目打包的时候,*Mapper.xml 文件会打不不进去解决办法
打包的时候,不同版本的 Eclipse 还有IDEA 会有打包打不进去Mapper.xml 文件,这个时候要加如下代码, 在<build> 标签内加入即可 <resources> ...
- Django——ContentType及ContentType-signals的使用
一.ContentType 在django中,有一个记录了项目中所有model元数据的表,就是ContentType,表中一条记录对应着一个存在的model,所以可以通过一个ContentType表的 ...
- Android查缺补漏(IPC篇)-- 进程间通讯基础知识热身
本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8479282.html 在Android中进程间通信是比较难的一部分,同时又非常 ...
- Go语言学习_Win10下安装Go开发环境
关于Go语言有多么值得学习,这里就不做介绍了,既然看了这篇文章,想必是对有学习意向. 这里是在Windows下安装Go环境,去中文社区的下载栏目,https://studygolang.com/dl ...
- RegexKitLite编译报错
报错如下: Undefined symbols for architecture i386: "_uregex_open", referenced from: _rkl_getC ...