参考资料地址:
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; } }
相关推荐
- 在处理文件权限时,比如Unix系统中的文件权限,我们可以用位运算来设置读、写、执行等权限。 - 在网络编程中,IP地址和端口号的处理经常用到位运算。 - 在内存管理中,位图常用于表示和操作大量资源的状态,如...
现在,当我们要检查一个用户是否具有特定权限时,可以将用户所属所有组的权限掩码进行按位或运算。如果结果中的某个特定位置为1,那么该用户就具有对应的权限。 以下是一个简单的PHP代码示例,展示了如何使用位运算...
4. **状态管理**:通过位运算可以轻松管理多个标志位的状态,比如权限控制、功能开关等。 综上所述,位运算在计算机科学中扮演着重要的角色,特别是在那些对性能要求极高的场景中。理解并掌握位运算的基本原理及...
在实际应用中,这种技术可以扩展到更复杂的权限体系,比如通过位掩码(bitmask)来表示更丰富的权限结构,或者与其他标识结合,实现更复杂的访问控制逻辑。同时,这样的设计也方便了权限的动态调整和权限集的比较。
在实际编程中,位运算可以用于高效计算,例如在处理二进制标志位、进行位掩码操作、优化数据结构等。例如,如果你有一个表示权限的二进制位,你可以通过位运算轻松地设置、检查或清除特定权限。 总之,理解和掌握...
例如,如果权限掩码是1101(即13,代表“查看”和“编辑”权限),并使用按位与运算与用户当前的权限掩码(如1110,即14,代表“查看”、“编辑”和“删除”权限)进行比较,结果为1100(即12),表明用户具有“查看...
位操作是计算机科学中的基本概念,它们涉及到单个比特(位)的逻辑运算,包括与(AND)、或(OR)、非(NOT)、异或(XOR)以及位移(左移和右移)。在Android应用中,尤其是JNI层面,位操作可能用于节省内存、提高...
示例说明:假设有一个IP地址 `192.168.0.1` 和子网掩码 `255.255.255.0`。 - **IP地址二进制表示**:11000000.10101000.00000000.00000001 - **子网掩码二进制表示**:11111111.11111111.11111111.00000000 - **...
总结来说,用二进制做权限设置是一种常见的系统编程技巧,它利用位运算高效地管理文件或资源的访问权限。这个程序可能是为了演示如何在不同的编程语言中实现这样的功能,对于理解操作系统底层的工作机制以及提升安全...
3. 数字掩码:通过位与操作,可以方便地检查或设置特定位,如权限控制、颜色编码等。 4. 位翻转:通过按位异或操作,可以实现数值的奇偶校验或者翻转所有位。 5. 快速查找:位图可以用于快速判断一个元素是否存在于...
按位与通常用于位掩码操作,比如权限判断。而按位或可以用来设置标志位。下面提供一个实际的例子,通过按位与来判断权限: ```php $my_privilege=15; // 权限值为1111,即1+2+4+8,拥有全部权限 $Pri ''; $...
在文章提供的代码示例中,$my_privilege变量被赋予了一个特定的值15,这是通过位运算得出的,它表示用户拥有增加、删除、修改和查询的全部权限。接着,通过遍历一个权限数组,并使用按位与运算符来判断用户是否拥有...
然后,我们使用`atoi()`函数将权限数字转换为整型,并与0777进行按位与运算,以确保只设置了合法的权限位。最后,我们调用`chmod()`函数并处理可能的错误。 在提供的文档“支持字母权限版chmod C语言实现-李利兵....
比如,要获取数字01111010101010101111111111111111的第6位,可以将该数字与掩码2^5(即100000)进行与运算,结果为100000,说明第6位为1。 三、数据库字段定义 在数据库设计中,可以创建一个整数字段,如`status`...
在示例中,权限以位掩码的形式存储在数据库中,如`news:3,gallery:1,users:15`。这种方法利用了位运算的效率,使得存储和检查权限变得更加简单。每个数字(如3、1、15)代表用户在不同模块上的权限组合。例如,数字3...
- **位掩码**:位运算常用于位掩码操作,例如在处理权限控制、颜色编码等场景。 3. **代码示例**: 在`main.java`文件中,可能会包含以下代码片段,展示了如何使用位运算符: ```java int num1 = 5; // 二进制...
- 示例:`umask 0022`(设置默认权限掩码为0022) 32. **配置文件档案隐藏属性:chattr** - `chattr` 命令用于更改文件的特殊属性。 - 示例:`chattr +i file`(使文件不可更改) 33. **显示档案隐藏属性:...
此运算常用于创建掩码,检查特定位是否设置。 2. **按位或(|)**: 如果两个相应的位至少有一个是1,结果位就是1,否则为0。常用于设置或开启特定位。 3. **按位异或(^)**: 如果两个相应的位相同,结果位是0;如果...
- `mode`参数通常是一个由不同权限位组成的掩码,例如`S_IRUSR | S_IWUSR | S_IXUSR`表示文件所有者具有读、写和执行权限。 - `umask`可以通过调用`umask()`函数来修改,用于屏蔽掉部分权限。默认情况下,umask的值...
在上面的代码中,我们首先调用`GetFileAttributes`获取文件属性,然后通过位运算检查文件是否具有特定的属性。`FILE_ATTRIBUTE_READONLY`和`FILE_ATTRIBUTE_HIDDEN`是常见的文件属性,但还有很多其他属性,如`FILE_...