一,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项目中来的二)的更多相关文章

  1. setBit testBit权限管理

    1.jdk7文档解释 public boolean testBit(int n) Returns true if and only if the designated bit is set. (Com ...

  2. 权限的分类(shiro项目中来的五)

    第一种权限:菜单栏展示还是不展示的权限(粗颗粒) 实现方法,在SYS_ROLE表中添加一个字段rights,通过 public static BigInteger sumRights(String[] ...

  3. 【基于url权限管理 shiro(一)】--基础

    只要有用户参与的系统一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源.权限管理包括用户认证和授权两部分.   用户认证 1.概 ...

  4. 《shiro》视频目录---1、权限管理-shiro

    \day01_shiro\0323\10realm支持散列.avi;\day01_shiro\0323\1权限管理原理.avi;\day01_shiro\0323\2权限管理解决方案.avi;\day ...

  5. 在UniApp的H5项目中,生成二维码和扫描二维码的操作处理

    在我们基于UniApp的H5项目中,需要生成一些二维码进行展示,另外也需要让用户可以扫码进行一定的快捷操作,本篇随笔介绍一下二维码的生成处理和基于H5的扫码进行操作.二维码的生成,使用了JS文件wea ...

  6. vue项目中批量打印二维码

    前提:项目中要打印的二维码为后台返回,批量选择后,点击打印,先打开二维码预览界面,再执行打印. 以下代码中 codePicList为选中的二维码数组.重点css:page-break-after:al ...

  7. 关于写SpringBoot+Mybatisplus+Shiro项目的经验分享二:问题1

    框架: SpringBoot+Mybatisplus+Shiro 简单介绍:关于写SpringBoot+Mybatisplus+Shiro项目的经验分享一:简单介绍 添加时,如果失败,不能正确跳转 c ...

  8. springboot+mybatis+shiro项目中使用shiro实现登录用户的权限验证。权限表、角色表、用户表。从不同的表中收集用户的权限、

    要实现的目的:根据登录用户.查询出当前用户具有的所有权限.然后登录系统后.根据查询到的权限信息进行不同的操作. 以下的代码是在搭好的框架之下进行的编码. 文章目录 核心实现部分. 第一种是将用户表和角 ...

  9. 页面某些特定图标的权限,比如导入导出表格,下载等等,这个权限必须在有某个页面查看的权利的基础上(细粒度)(shiro项目中来的四)

    一,查找按钮权限的设置 第一步:会根据用户的相关信息去查到它的角色表: SELECT * FROM SYS_USER WHERE user_id='eded77bdf35347249b2bacfa18 ...

随机推荐

  1. UOJ Round #15 [构造 | 计数 | 异或哈希 kmp]

    UOJ Round #15 大部分题目没有AC,我只是水一下部分分的题解... 225[UR #15]奥林匹克五子棋 题意:在n*m的棋盘上构造k子棋的平局 题解: 玩一下发现k=1, k=2无解,然 ...

  2. BZOJ 3787: Gty的文艺妹子序列 [分块 树状数组!]

    传送门 题意:单点修改,询问区间内逆序对数,强制在线 看到加了!就说明花了不少时间.... 如果和上题一样预处理信息,用$f[i][j]$表示块i到j的逆序对数 强行修改的话,每个修改最多会修改$(\ ...

  3. BZOJ 1801: [Ahoi2009]chess 中国象棋 [DP 组合计数]

    http://www.lydsy.com/JudgeOnline/problem.php?id=1801 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放 ...

  4. jquery参考手册

    开始使用 jQueryjQuery 本身只有一个 js 文件,所以,要使用它,就和使用其它的 js 文件一样,直接将它引入就可以使用了. <script type="text/java ...

  5. 自己动手实践 spring retry 重试框架

    前序 马上过年了,预祝大家,新年快乐,少写bug 什么是spring retry? spring retry是从spring batch独立出来的一个能功能,主要实现了重试和熔断. 什么时候用? 远程 ...

  6. 应用负载均衡之LVS(一):基本概念和三种模式

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  7. console那些你不曾知道的玩法

    一.console最常见的四种方法: FireFox(58) Chrome(51) 二.打印对象: 平时想输出对象属性时,可以直接打印对象,对Object使用toString方法会得到 [Object ...

  8. Mac系统下XAMPP的简单使用

    XAMPP简单使用的方法使用方法 XAMPP的简介即应用在博客园也有 1.安装完成后打开manager-osx.app 把Manager Servers下的三个server打开(使之变绿如下) 第一个 ...

  9. 基于MATLAB2016b图形化设计自动生成Verilog语言的积分模块及其应用

    在电力电子变流器设备中,常常需要计算发电量,由于电力电子变流器设备一般是高频变流设备,所以发电量的计算几乎时实时功率的积分,此时就会用到一个积分模块.发电量计算的公式如下:Q=∫P. FPGA由于其并 ...

  10. Linux 每日命令行

    uptime 用于查看系统的负载信息. 它依次显示 当前系统时间.系统已运行时间.启用终端数量及平均负载值等信息.平均负载指的是系统在最近1分钟.5分钟.15分钟内的压力情况:负载值越低越好,尽量不要 ...