Java中利用位与和位或进行函数参数优化的技巧
2016-05-17 17:24
615 查看
位与的规则是同1为1,其余为0;位或的规则是同0为0,其余为1。
利用这个规则,我们看一下这几个数:
在Java中一个int占用4个字节,32位。我们省去前面的0,保留八位显示:
1的二进制表示为0000 0001
2的二进制表示为0000 0010
4的二进制表示为0000 0100
8的二进制表示为0000 1000
根据位或原则:
1|2= 0000 0011
1|2|4= 0000 0111
1|2|4|8=0000 1111
根据位与原则看以下三个计算:
(1|2|4)&1
0000 0111
0000 0001
=0000 0001
(1|2|4)&2
0000 0111
0000 0010
=0000 0010
(1|2|4)&8
0000 0111
0000 1000
=0000 0000
这样会得出一个结论,用自己的语言总结一下:多个2的n次方的数进行位或操作后得到的值与其中一个数进行位与操作得到的结果不为0。与其他2的n次方的数进行位与操作结果为0。
利用这个技巧我们可以这么做:
如果你留意过JDK中正则表达式处理的源码就会发现其实在java.util.regex.Pattern中就使用了这个技巧,这样我们在初始化java.util.regex.Pattern对象时就可以这么写:
如果不使用这个方式,功能当然也可以实现,不过传递的参数可能是一个数组甚至是多个参数。
利用这个规则,我们看一下这几个数:
在Java中一个int占用4个字节,32位。我们省去前面的0,保留八位显示:
1的二进制表示为0000 0001
2的二进制表示为0000 0010
4的二进制表示为0000 0100
8的二进制表示为0000 1000
根据位或原则:
1|2= 0000 0011
1|2|4= 0000 0111
1|2|4|8=0000 1111
根据位与原则看以下三个计算:
(1|2|4)&1
0000 0111
0000 0001
=0000 0001
(1|2|4)&2
0000 0111
0000 0010
=0000 0010
(1|2|4)&8
0000 0111
0000 1000
=0000 0000
这样会得出一个结论,用自己的语言总结一下:多个2的n次方的数进行位或操作后得到的值与其中一个数进行位与操作得到的结果不为0。与其他2的n次方的数进行位与操作结果为0。
利用这个技巧我们可以这么做:
public class T4 { private int flags; private boolean has(int f) { return (flags & f) != 0; } public void doService(int flags){ this.flags=flags; if(has(1)){ System.out.println("送U盘"); } if(has(2)){ System.out.println("送手机"); } if(has(4)){ System.out.println("送电脑"); } if(has(8)){ System.out.println("送汽车"); } } public static void main(String[] args) { T4 t4 = new T4(); t4.doService(1|2|4); System.out.println("---------------分割线-----------------"); t4.doService(2|8); //打印的结果: // 送U盘 // 送手机 // 送电脑 // ---------------分割线----------------- // 送手机 // 送汽车 } }
如果你留意过JDK中正则表达式处理的源码就会发现其实在java.util.regex.Pattern中就使用了这个技巧,这样我们在初始化java.util.regex.Pattern对象时就可以这么写:
Pattern pattern=Pattern.compile("\\w",Pattern.CASE_INSENSITIVE|Pattern.COMMENTS|Pattern.MULTILINE);
如果不使用这个方式,功能当然也可以实现,不过传递的参数可能是一个数组甚至是多个参数。
相关文章推荐
- 2016-5-17 java验证框架 Validator的使用
- 【Codeforces】66A - Petya and Java(模拟)
- struts2接收参数的3种方法
- Java中普通代码块,构造代码块,静态代码块区别及代码示例
- mate 8、荣耀6,手机连接eclipse、AS调试应用没有log输出
- 二叉查找树(AVL)插入算法Java实现
- spring-boot之入门实践
- Java书籍分享
- Spring中jdbcTemplate的用法实例
- Java基础01---操作符
- SpringMVC4零配置--web.xml
- Java环境设置
- springMVC -- 整合UEditor(富文本编辑器)
- java中DatagramSocket连续发送多个数据报包时产生丢包现象解决方案
- 第十七章 springboot + devtools(热部署)
- java Gzip 压缩与解压缩
- Java中堆和栈的区别
- javaweb数据库的连接
- myeclipse工程当中的.classpath 和.project文件什么作用?
- Java--银行存取款线程设计2(线程互斥)