`
kanpiaoxue
  • 浏览: 1777067 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

位运算&位掩码示例(权限)

 
阅读更多

 

参考资料地址:

1、https://juejin.cn/post/6844903909333401607

2、https://www.jianshu.com/p/78a984173985

3、【精华】《位运算(位掩码BitMask)的简单应用场景浅析》 https://www.jianshu.com/p/78a984173985

 

位掩码示例:

import org.apache.commons.lang3.StringUtils;

import com.google.common.collect.Lists;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Hello world!
 *
 */
public class App {
    public static void main(String[] args) {

        System.out.println(String.format("%2s:%s", Perms.READ, toBinaryStringFormat(Perms.READ)));
        System.out.println(String.format("%2s:%s", Perms.WRITE, toBinaryStringFormat(Perms.WRITE)));
        System.out.println(String.format("%2s:%s", Perms.CREATE, toBinaryStringFormat(Perms.CREATE)));
        System.out.println(String.format("%2s:%s", Perms.DELETE, toBinaryStringFormat(Perms.DELETE)));
        System.out.println(String.format("%2s:%s", Perms.ADMIN, toBinaryStringFormat(Perms.ADMIN)));
        System.out.println(String.format("%2s:%s", Perms.ALL, toBinaryStringFormat(Perms.ALL)));
        System.out.println(String.format("%2s:%s", Perms.DENY_ALL, toBinaryStringFormat(Perms.DENY_ALL)));

        System.out.println(String.format("%s", StringUtils.repeat("=", 100)));

        Perms p = new Perms();
        p.setPermission(Perms.READ);
        System.out
                .println(String.format("%2s:%s", p.getPermission(), toBinaryStringFormat(p.getPermission())));
        p.enable(Perms.WRITE | Perms.CREATE);
        System.out
                .println(String.format("%2s:%s", p.getPermission(), toBinaryStringFormat(p.getPermission())));
        p.enable(Perms.ADMIN);
        System.out
                .println(String.format("%2s:%s", p.getPermission(), toBinaryStringFormat(p.getPermission())));

    }

    public static String toBinaryStringFormat(int perm) {
        String string = StringUtils.leftPad(Integer.toBinaryString(perm), Integer.SIZE, '0');
        List<List<String>> lists = Lists.partition(Arrays.asList(string.split("")), Byte.SIZE);
        return lists.stream().map(list -> {
            return String.join("", list);
        }).collect(Collectors.joining(" "));
    }

}

class Perms {
    /**
     * 00000000 00000000 00000000 00000001
     */
    public static final int READ = 1 << 0;
    /**
     * 00000000 00000000 00000000 00000010
     */
    public static final int WRITE = 1 << 1;
    /**
     * 00000000 00000000 00000000 00000100
     */
    public static final int CREATE = 1 << 2;
    /**
     * 00000000 00000000 00000000 00001000
     */
    public static final int DELETE = 1 << 3;
    /**
     * 00000000 00000000 00000000 00010000
     */
    public static final int ADMIN = 1 << 4;
    /**
     * 00000000 00000000 00000000 00011111
     */
    public static final int ALL = READ | WRITE | CREATE | DELETE | ADMIN;
    public static final int DENY_ALL = READ & WRITE & CREATE & DELETE & ADMIN;

    // 存储目前的权限状态
    private int flag;

    /**
     * 移除一项或多项权限
     */
    public void disable(int permission) {
        flag &= ~permission;
    }

    /**
     * 添加一项或多项权限
     */
    public void enable(int permission) {
        flag |= permission;
    }

    /**
     *
     * 得到当前权限
     */
    public int getPermission() {
        return flag;
    }

    /**
     * 是否拥有某项权限
     */
    public boolean isAllow(int permission) {
        return (flag & permission) == permission;
    }

    /**
     * 是否禁用了某些权限
     */
    public boolean isNotAllow(int permission) {
        return (flag & permission) == 0;
    }

    /**
     * 是否仅仅拥有某些权限
     */
    public boolean isOnlyAllow(int permission) {
        return flag == permission;
    }

    /**
     * 重新设置权限
     */
    public void setPermission(int permission) {
        flag = permission;
    }
}

 

分享到:
评论

相关推荐

    c语言基础-c语言编程基础之按位运算示例.zip

    - 在处理文件权限时,比如Unix系统中的文件权限,我们可以用位运算来设置读、写、执行等权限。 - 在网络编程中,IP地址和端口号的处理经常用到位运算。 - 在内存管理中,位图常用于表示和操作大量资源的状态,如...

    交叉会员权限解决方法示例

    现在,当我们要检查一个用户是否具有特定权限时,可以将用户所属所有组的权限掩码进行按位或运算。如果结果中的某个特定位置为1,那么该用户就具有对应的权限。 以下是一个简单的PHP代码示例,展示了如何使用位运算...

    二进制的基础上的位运算

    4. **状态管理**:通过位运算可以轻松管理多个标志位的状态,比如权限控制、功能开关等。 综上所述,位运算在计算机科学中扮演着重要的角色,特别是在那些对性能要求极高的场景中。理解并掌握位运算的基本原理及...

    .net 运用二进制位运算进行数据库权限管理

    在实际应用中,这种技术可以扩展到更复杂的权限体系,比如通过位掩码(bitmask)来表示更丰富的权限结构,或者与其他标识结合,实现更复杂的访问控制逻辑。同时,这样的设计也方便了权限的动态调整和权限集的比较。

    Python 刷题笔记:位运算专题一

    在实际编程中,位运算可以用于高效计算,例如在处理二进制标志位、进行位掩码操作、优化数据结构等。例如,如果你有一个表示权限的二进制位,你可以通过位运算轻松地设置、检查或清除特定权限。 总之,理解和掌握...

    角色权限管理

    例如,如果权限掩码是1101(即13,代表“查看”和“编辑”权限),并使用按位与运算与用户当前的权限掩码(如1110,即14,代表“查看”、“编辑”和“删除”权限)进行比较,结果为1100(即12),表明用户具有“查看...

    bitoperation_jni_AndroidJNI位操作_android_

    位操作是计算机科学中的基本概念,它们涉及到单个比特(位)的逻辑运算,包括与(AND)、或(OR)、非(NOT)、异或(XOR)以及位移(左移和右移)。在Android应用中,尤其是JNI层面,位操作可能用于节省内存、提高...

    IP地址知识_子网掩码与子网划分

    示例说明:假设有一个IP地址 `192.168.0.1` 和子网掩码 `255.255.255.0`。 - **IP地址二进制表示**:11000000.10101000.00000000.00000001 - **子网掩码二进制表示**:11111111.11111111.11111111.00000000 - **...

    最近再想做权限的控制,写了一个小程序.有兴趣的朋友可以下载看看用二进制做权限设置.

    总结来说,用二进制做权限设置是一种常见的系统编程技巧,它利用位运算高效地管理文件或资源的访问权限。这个程序可能是为了演示如何在不同的编程语言中实现这样的功能,对于理解操作系统底层的工作机制以及提升安全...

    java 位操作集合以及应用技巧

    3. 数字掩码:通过位与操作,可以方便地检查或设置特定位,如权限控制、颜色编码等。 4. 位翻转:通过按位异或操作,可以实现数值的奇偶校验或者翻转所有位。 5. 快速查找:位图可以用于快速判断一个元素是否存在于...

    PHP中的按位与和按位或操作示例

    按位与通常用于位掩码操作,比如权限判断。而按位或可以用来设置标志位。下面提供一个实际的例子,通过按位与来判断权限: ```php $my_privilege=15; // 权限值为1111,即1+2+4+8,拥有全部权限 $Pri ''; $...

    浅析PHP 按位与或 (^ 、&amp;)

    在文章提供的代码示例中,$my_privilege变量被赋予了一个特定的值15,这是通过位运算得出的,它表示用户拥有增加、删除、修改和查询的全部权限。接着,通过遍历一个权限数组,并使用按位与运算符来判断用户是否拥有...

    chmod的C语言实现

    然后,我们使用`atoi()`函数将权限数字转换为整型,并与0777进行按位与运算,以确保只设置了合法的权限位。最后,我们调用`chmod()`函数并处理可能的错误。 在提供的文档“支持字母权限版chmod C语言实现-李利兵....

    php 数据库字段复用的基本原理与示例

    比如,要获取数字01111010101010101111111111111111的第6位,可以将该数字与掩码2^5(即100000)进行与运算,结果为100000,说明第6位为1。 三、数据库字段定义 在数据库设计中,可以创建一个整数字段,如`status`...

    asp.net 权限管理分析

    在示例中,权限以位掩码的形式存储在数据库中,如`news:3,gallery:1,users:15`。这种方法利用了位运算的效率,使得存储和检查权限变得更加简单。每个数字(如3、1、15)代表用户在不同模块上的权限组合。例如,数字3...

    java代码-日常练习8,位运算符###

    - **位掩码**:位运算常用于位掩码操作,例如在处理权限控制、颜色编码等场景。 3. **代码示例**: 在`main.java`文件中,可能会包含以下代码片段,展示了如何使用位运算符: ```java int num1 = 5; // 二进制...

    Linux常用操作命令

    - 示例:`umask 0022`(设置默认权限掩码为0022) 32. **配置文件档案隐藏属性:chattr** - `chattr` 命令用于更改文件的特殊属性。 - 示例:`chattr +i file`(使文件不可更改) 33. **显示档案隐藏属性:...

    Bitwise.class:对于我的按位授课

    此运算常用于创建掩码,检查特定位是否设置。 2. **按位或(|)**: 如果两个相应的位至少有一个是1,结果位就是1,否则为0。常用于设置或开启特定位。 3. **按位异或(^)**: 如果两个相应的位相同,结果位是0;如果...

    LINUX下文件操作函数的介绍.

    - `mode`参数通常是一个由不同权限位组成的掩码,例如`S_IRUSR | S_IWUSR | S_IXUSR`表示文件所有者具有读、写和执行权限。 - `umask`可以通过调用`umask()`函数来修改,用于屏蔽掉部分权限。默认情况下,umask的值...

    vc++获得文件属性

    在上面的代码中,我们首先调用`GetFileAttributes`获取文件属性,然后通过位运算检查文件是否具有特定的属性。`FILE_ATTRIBUTE_READONLY`和`FILE_ATTRIBUTE_HIDDEN`是常见的文件属性,但还有很多其他属性,如`FILE_...

Global site tag (gtag.js) - Google Analytics