位运算的一些用例
来源:互联网 发布:淘宝刷好评买家封号 编辑:程序博客网 时间:2024/04/26 05:58
位运算的一些用例
位运算
几乎每种编程语言都为我们提供一种运算,它直接操作二进制数据,这种运算叫做位运算。
位运算分为移位、取反、与、或、异或、非,其中移位又包括左移位、右移位、左无符号移位、右无符号移位。
位运算的用例一—权限控制
假设有这么一个场景,需要对某个文件设置权限,假设有三种权限需要设置:读、写、执行。那么通常的做法可能就是采用三个布尔值来存储当前的权限。
那么写法通常可能是这样:
public class Permission { private boolean is_allowed_read = false; private boolean is_allowed_write = false; private boolean is_allowed_execution = false; public Permission() { } public Permission(boolean is_allowed_read, boolean is_allowed_write, boolean is_allowed_execution) { this.is_allowed_read = is_allowed_read; this.is_allowed_write = is_allowed_write; this.is_allowed_execution = is_allowed_execution; } public void setIsAllowedRead(boolean is_allowed_read) { this.is_allowed_read = is_allowed_read; } public boolean getIsAllowedRead() { return this.is_allowed_read; } public void setIsAllowedWrite(boolean is_allowed_write) { this.is_allowed_write = is_allowed_write; } public boolean getIsAllowedWrite() { return this.is_allowed_write; } public void setIsAllowedExecution(boolean is_allowed_execution) { this.is_allowed_execution = is_allowed_execution; } public boolean getIsAllowedExecution() { return this.is_allowed_execution; }}
上面这种写法可能是比较常见的,比较符合我们的思维习惯,但是使用位运算中掩码的概念来改写这个例子,会使得更加简洁、高效。
public class Permission { private final static byte Allowe_Read = 1 << 0;//00000001 private final static byte Allowe_Write = 1 << 1;//00000010 private final static byte Allow_Execution = 1 << 2;//00000100 private byte permissionMask = 0x00;//默认没有任何权限 public Permission() { } public Permission(byte permission) { this.permissionMask = permission; } //增加一项或者多项权限 public void enable(byte permission) { this.permissionMask |= permission; } //禁用一项或多项的权限 public void disable(byte permission) { this.permissionMask &= ~permission; } //查询一项或多项权限是否被启用 public boolean isAllowed(byte permission) { return this.permissionMask & permission == permission; } //查询一项或多项权限是否被禁用 public boolean isDisAllowed(byte permission) { return this.permissionMask & permission == 0; }}
这种写法明显表达的信息量要多于第一种写法,举个例子:现在要同时启用三种权限,那么第一种写法就是:
setIsAllowedRead(true);setIsAllowedWrite(true);setIsAllowedExecution(true);
而第二种写法就是:
enable(Permission.ALLOW_READ | Permission.ALLOW_WRITE | Permission.ALLOW_EXECUTION);
这种写法对于使用Permission
类的时候来说,方便许多。在Linux
系统中设置权限时通常会用到
bash
chmod 777 file
其中777
就是1111111 | 1111111 | 1111111
,可见Linux
里面也是采用位运算中的掩码来设置文件权限的。
用位运算的方式来实现这个权限控制的优点是:高效,位运算比较接近与机器的运算方式;简洁,无论试编写还是使用都比较方便简洁。
缺点:代码不够直观,可读性差,当维护这段代码的时候可能比较恼火, 不如第一种写法一目了然。
通常如果需要维护n
个开关变量(二值变量)的时候,只需要n
位二进制的整数和数个mask
即可,完成状态的保存和查询。这种写法在Android SDK
里面是非常常见的。
可以加以推广,如果需要保存n
个具有m
种状态的变量,那么需要一个n
位m
进制的数即可完成。
阅读全文
0 0
- 位运算的一些用例
- 一些用位运算解决的方法
- 用位运算的一些面试题
- 位运算的一些巧用
- 位运算的一些技巧
- 一些有趣的位运算
- 位运算的一些用途
- 位运算的一些案例
- 位运算的一些总结
- 位运算的一些应用
- 位运算的一些总结
- 位运算的一些总结
- 一些常用的位运算 | & ^
- 位运算的一些算法
- 一些运算的位操作
- 位运算的一些注意事项
- 位运算的一些运用的技巧。
- 位运算应该知道的一些基础知识
- 大数据WEB阶段(四)JavaScript
- Unet局域网框架
- 常见字符集和编码方式
- HDU 4501 小明系列故事——买年货(三维背包)
- iOS 常用修饰词
- 位运算的一些用例
- 区块链:区块链技术初探(一)
- poj 1835 宇航员
- Mycat使用之MySQL单库分表及均分数据
- 网络安全常识
- 如何摆脱成为一个油腻的中年人
- LaTeX快速指南(一)安装LaTeX
- 基于HTML5 Canvas 实现地铁站监控
- poj 3087 Shuffle'm Up