运算符优先级
~的优先级最高,其次是<<、>>和>>>,再次是&,然后是^,优先级最低的是|
>>运算符
>>是有符号位右移,简单来说就是看二进制高位的第一位是0还是1,用它来补足右移过程中缺失的高位。
代码:
int n = -0xf0;
System.out.println("number:"+n);
System.out.println("binary:"+Integer.toBinaryString(n));
System.out.println("length:"+Integer.toBinaryString(n).length());
n = n>>2;
System.out.println("number:"+n);
System.out.println("binary:"+Integer.toBinaryString(n));
System.out.println("length:"+Integer.toBinaryString(n).length());
结果:
number:-240
binary:11111111111111111111111100 1
length:32
number:-60
binary:11111111111111111111111111
length:32
分析:
可以很明显的比较出结果 1 和 2的差别
>>>运算符
>>>是无符号位右移,高位统一用0补足
代码:
int n = -0xf0;
System.out.println("number:"+n);
System.out.println("binary:"+Integer.toBinaryString(n));
System.out.println("length:"+Integer.toBinaryString(n).length());
n = n>>>2;
System.out.println("number:"+n);
System.out.println("binary:"+Integer.toBinaryString(n));
System.out.println("length:"+Integer.toBinaryString(n).length());
结果:
number:-240
binary:11111111111111111111111100 1
length:32
number:1073741764
binary:001111111111111111111111
length:30
分析:
你可以看到结果2中高位补足了两位00,只是在转换成二进制字符串时首位0不显示而已。
<<运算符
<< 是左移,低位用0补足
代码:
int n = 0xf0;
System.out.println("number:"+n);
System.out.println("binary:"+Integer.toBinaryString(n));
System.out.println("length:"+Integer.toBinaryString(n).length());
n = n<<2;
System.out.println("number:"+n);
System.out.println("binary:"+Integer.toBinaryString(n));
System.out.println("length:"+Integer.toBinaryString(n).length());
结果:
number:240
binary:11110000 1
length:8
number:960
binary:1111000000 2
length:10
分析:仔细观察可以发现结果2的低位补足两位0
^运算符
^ 是异或运算符
运算规程:
0^0=0
1^0=1
0^1=1
1^1=0
l按位异或可以用来使某些特定的位翻转,如对数10100001的第2位和第3位翻转,可以将数与00000110进行按位异或运算。
l 通过按位异或运算,可以实现两个值的交换,而不必使用临时变量。
例如交换两个整数a,b的值,可通过下列语句实现:
a=10100001, b=00000110
a=a^b; //a=10100111
b=b^a; //b=10100001
a=a^b; //a=00000110
l 异或运算符的特点是:数a两次异或同一个数b(a=a^b^b)仍然为原值a.