一,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. bzoj 4546: codechef XRQRS [可持久化Trie]

    4546: codechef XRQRS 可持久化Trie codechef上过了,bzoj上蜜汁re,看别人说要开5.2e5才行. #include <iostream> #includ ...

  2. Windows Azure Platform Introduction (14) 申请海外的Windows Azure账户

    <Windows Azure Platform 系列文章目录> 本文的最后更新时间为:2017-12-27 本文介绍国内用户,注册和使用海外Azure账户. 前提: 1.需要一个有效的Wi ...

  3. 注册表操作(VC_Win32)

    注册表操作(VC_Win32) 数据类型 注册表的数据类型主要有以下四种:显示类型(在编辑器中)  数据类型  说明 REG_SZ  字符串  文本字符串REG_MULTI_SZ     多字符串   ...

  4. Google chrome浏览器中通过扩展调用本地应用程序以及和程序相互通讯(C++)

    最近项目用到浏览插件的开发,IE用到的是BHO,chrome打算做成扩展. 但是和ie有一点不同,chrome扩展是基于html+js+css开发的,那么就会有二个问题 1. 代码和算法等容易被别人复 ...

  5. 一、爬虫的基本体系和urllib的基本使用

    爬虫 网络是一爬虫种自动获取网页内容的程序,是搜索引擎的重要组成部分.网络爬虫为搜索引擎从万维网下载网页.一般分为传统爬虫和聚焦爬虫. 爬虫的分类 传统爬虫从一个或若干初始网页的URL开始,获得初始网 ...

  6. python实现HOG+SVM对CIFAR-10数据集分类(上)

    本博客只用于学习,如果有错误的地方,恳请指正,如需转载请注明出处. 看机器学习也是有一段时间了,这两天终于勇敢地踏出了第一步,实现了HOG+SVM对图片分类,具体代码可以在github上下载,http ...

  7. git恢复误删除文件

    在git仓库管理下误删除文件一般会分为以下3种情况: 1.手动直接删掉,如选择-右击-删除 这种删除未修改本地仓库[版本库],只修改了工作区,直接git checkout -- fileName即可恢 ...

  8. Jenkins持续集成-自动化部署脚本的实现

    要实现Jenkins端的持续集成,其实在CI服务配置端很容易,难点呢?就是如何实现自动化的部署.我的脚本设计就是为了解决以下难题: 难点一.如何使得自动化部署脚本更通用 我用的脚本,依赖依赖一个配置文 ...

  9. PHP将HTML的内容保存成word文档

    <?php class word { function start() { ob_start(); echo '<html xmlns:o="urn:schemas-micros ...

  10. python学习:递归列出目录里的文件

    #!/usr/bin/python   import os import sys   def print_files(path):     lsdir = os.listdir(path)     d ...