Java运算符有很多,我们在之前的文章中也有介绍,并且着重的介绍了一些它们的特性,今天我们来详细的关注一下 & | ~ ^ 这四个运算符。
1. &:按位的与,当上下都为1的时候才为1,这里我们举个简单地例子:6&2
我们将6换算成2进制是110,将2换算成2进制是010,那么
110
& 010
010
结果是010也就是2.在某些情况下它是可以取代%运算的,当我们用一个数去%2的n次方的时候,就相当于我们用这个数&2的n次方减1.
2. |: 按位的或,当上下不一样的时候,才写1
3. ~:按位的取反,0变1,1变0
4. ^:按位的异或,当上下不一样的时候才写1,可以用来不借助第三块空间交换两个数值的值
int x = 33;
int y = 99;
x = x ^ y;
y = x ^ y;
x = x ^ y;
5. 上面我们简单介绍了一下,接下来我们将详细介绍一下他们在java中的使用
在Java JDK1.6的HashMap中,对于Map的DEFAULT_INITIAL_CAPACITY属性有这么一句话MUST be a power of two.也就是说map要求使用者
在初始化的时候,capacity必须是2的n次方,原因很简单,我们很容易使用 hashCode & (length-1)这一特性,高效的求出分组组数。
6. Java当中对于修饰符,其实就是通过&来进行验证的,我们可以去看一下源码,java.lang.reflect.Modifier,下面是我们给出的例子
import java.lang.reflect.*;
import java.lang.*;
public class Test4modifier{
public static int a = 1;
final int b = 2;
public final int c = 3;
public static void main(String[] args)throws Exception{
Class myTest = Test4modifier.class;
Field[] fields = myTest.getDeclaredFields();
Method[] methods = myTest.getDeclaredMethods();
for(Field field:fields){
System.out.println("name:"+field.getName()+"===修饰符代表的数字:"+field.getModifiers());
System.out.println("name:"+field.getName()+"===修饰符:"+Modifier.toString(field.getModifiers()));
}
for(Method method:methods){
System.out.println("方法名字"+method.getName()+"===方法修饰符代表的数字:"+method.getModifiers());
System.out.println("方法名字:"+method.getName()+"===方法修饰符:"+Modifier.toString(method.getModifiers()));
}
}
}
7. 我们也可以通过这几个运算符来模拟一下Unix的权限
public class Test4Operator{
private static int x =1;//执行
private static int w = 2;//写
private static int r = 4;//读
public static void main(String[] args){
int power = 1;//假设一个人只有执行的权限
power = addJurisdiction(power,2);
System.out.println(checkJurisdiction(power,x));
power = deleteJurisdiction(power,x);
System.out.println(checkJurisdiction(power,x));
}
//增加权限的方法
public static int addJurisdiction(int owner,int added){
return owner | added;
}
//删除权限的方法
public static int deleteJurisdiction(int owner,int added){
return owner & (~added);
}
//验证权限的方法
public static Boolean checkJurisdiction(int woner,int juri){
return (woner & juri) == 0?false:true;
}
}
8. 其实在Java中这几个运算符还有很多妙用,比如说处理图片等,我们先简单介绍到这里。