位与的规则是同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。
利用这个技巧我们可以这么做:
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);
如果不使用这个方式,功能当然也可以实现,不过传递的参数可能是一个数组甚至是多个参数。