位运算经常能写出一些奇怪的代码,据说运算速度更快,这个我在使用中测试下来倒没发现运算效率有多少提高。但是一来可以提升技(zhuang)能(bi),二来帮助我们更多的了解位运算。
1. 判断奇偶
我们在判断一个整数是不是奇数,一般代码如下
public static boolean isOdd(int num) {
return num % 2 == 1;
}
那么如果用位运算则可以写成下面这样
public static boolean isOdd(int num) {
return (num & 1) == 1;
}
据说速度能快4倍,不知道是我测试的数比较小还是什么原因,效果相关不大
思考
上面的两个方法对判断负数是否适用呢?大家可以测试下看看
2. 保存多种类型开关状态
比如说有以下三个模块:音乐、视频、小说
这三个模块对用户来说可以都有权限访问,也可以只拥有部分权限或者都没有权限,因为我们只需要记录有无两个状态,对应到多模块的时候,可以简单的用位运算进行组合
// 无任何权限
int none = 0;
int music = 1 << 0;
int video = 1 << 1;
int story = 1 << 2;
// 所有权限都有
int permissions = music | video | story;
boolean hasMusicPermission = (permissions & music) > 0;
boolean hasVideoPermission = (permissions & video) > 0;
boolean hasStoryPermission = (permissions & story) > 0;
在 permission 里面有什么权限就 | (或) 上权限的值就可以了
今天先记录两个常用的到的场景,后面会继续补充更多的用法的。