位操作符是用来操作整数基本数据类型中的单个“比特(bit)”,即二进制位,按位操作符会对两个参数中对应的位执行布尔代数运算,并最终生成一个结果。
java对位的操作符都包含那些呢?
下来我来罗列一下java的位操作符:
1. ‘&’ 按位 ‘与’
如果a和b值都为1,则结果为1,否则结果为0。
例如:
int a = 1;
int b = 0;
System.out.println(a & b); 结果是0
int a = 1;
int b = 1;
System.out.println(a & b); 结果是1
2. ‘|’ 按位 ‘或’
如果a和b其中一个值为1,则结果为1,如果两个都为0,则结果为0。
例如:
int a = 1;
int b = 0;
System.out.println(a | b); 结果是1
int a = 0;
int b = 0;
System.out.println(a | b); 结果是0
3.'^' 按位 ‘异或’
如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
例如:
int a = 0;
int b = 1;
System.out.println(a ^ b); 结果为1
int a = 1;
int b = 1;
System.out.println(a ^ b); 结果为0
4.‘~’非也称为按位取反操作符
这里要提醒的一点是,这里的取反是按照数据的补码进行取反;
int a = 0;
System.out.println( ~a); 结果为-1
int a = 19;
System.out.println(~a); 结果为:20
计算原理:
求出19的二进制码:10011
19的补码为:00010011
19的反码为:11101100
那么根据计算公式,我们可以算出19的反码的10进制数为:-20
(-1)*2^7 + 1*2^6 + 1*2^5 + 0*2^4 + 1*2^3 + 1*2^2 + 0*2^1 + 0*2^0
= -128 + 64 + 32 + 0 + 8 + 4 + 0 + 0
= -20
这里还需要说明一点:“~”是一元操作符,不能与 ”=“ 联合使用,而&、^、|是二元操作符,均可以与 “=” 联合使用
5.‘<<’左位移运算符
左位移是按照操作符右侧指定的位数讲操作符左边的数据向左移动(低位补0);
‘>>’有符号右移运算符
右位移是按照操作符右侧指定的位数讲操作符左边的数据向右移动,有符号右位移运算使用符号扩展,若符号为正,则高位插入0,若符号为负,则高位插入1
‘>>>’无符号右移运算使用零扩展,无论正负,最高位都插入0。
那么如何进行位移运算呢?
int占4个字节的空间即32bit(32位)
那么 19 的二进制数应该为:
0000 0000 0000 0000 0000 0000 0001 0011
19 << 3 19向左移动3位后的结果
0000 0000 0000 0000 0000 0000 1001 1000
转换为10进制数为:
1*2^7 + 1*2^4 + 1*2^3
= 128 + 16 + 8
= 152
19 >> 3 19向右移动3位后的结果是
0000 0000 0000 0000 0000 0000 0000 0010
转换为10进制结果为:
1*2^1 = 2
19 >>> 3 无符号向右移动3位结果是
0000 0000 0000 0000 0000 0000 0000 0010
转换为10进制结果为:
1*2^1 = 2
在这里需要注意的是,位移可以与等号(=)进行联合使用,如果对char、byte或者short类型进行位移运算时则需要先转换为int再进行位移运算,否则直接计算的结果可能是不正确的。