位运算符除按位运算符中的按位与和按位或运算符外,其他的只能用于整数间的运算。位运算符是针对整数在内存中存储的二进制数据流中的位进行的操作。例如表达式“2<<1”表示将整数2在内存中的二进制数据流向左移动一位。运算过程如下:
[img]http://dl.iteye.com/upload/attachment/306743/b08bd351-79a6-3485-8760-6eaf5f030625.jpg[/img]
Java语言中的位运算符又分为按位运算符和移位运算符,下面分别进行介绍。
1、按位运算符
按位运算符是将整数的二进制数据流中的每个位进行运算,该运算只包括以下4种:按位与运算、按位或运算、按位异或运算和按位取反运算,它们所对应的运算符及运算规则如下表1所示:
[img]http://dl.iteye.com/upload/attachment/306801/af9023e4-a3b7-3b47-91e2-60cb865efda6.jpg[/img]
按位与运算,只有两个二进制位数都为1时结果才为1;按位或运算,只要有一个二进制位数为1则结果为1;按位异或运算,两个二进制位数相同(同时为0或1)时结果为0,否则为1;按位取反运算符为一元运算符,取反运算是将二进制中的0修改为1,1修改为0。
下面的代码显示了按位运算符的用法:
int a = 5 & -4;//整数5与-4的按位与运算,结果为:4
int b = 3 | 6;//整数3与6的按位或运算,结果为:7
int c = 10 ^ 3;//整数10与3的按位异或运算,结果为:9
int d = ~(-14);//整数-14的按位取反运算,结果为:13
代码中各表达式的运算过程分别如图1~4所示:
[img]http://dl.iteye.com/upload/attachment/306749/773f491b-bff1-3b81-8b15-21954f27d43f.jpg[/img]
[img]http://dl.iteye.com/upload/attachment/306751/3a4acd24-8f2a-35a1-b434-a974b4f0c393.jpg[/img]
在Java中,按位运算符可以与赋值运算符“=”组合为复合赋值运算符,例如:
int num = 5;
num &= 6;//等价于:num = num & 6;
System.out.println(num);//运行结果为:4
当按位与和按位或运算符两边的操作元为布尔数据时,则被视为逻辑运算符。
例如以下的表达式是合法的:
int a = 3;
int b = 9;
System.out.println((a<b)&((a+4)>b));//输出结果:false
System.out.println((a<b)|((a+4)>b));//输出结果:true
2、移位运算符
移位运算符同样也是对整数的二进制中的位进行操作。Java中的移位运算符包括以下3种:左移位运算、有符号整数的右移位运算和无符号整数的右移位运算。它们所对应的运算符及运算规则如下表2所示:
[img]http://dl.iteye.com/upload/attachment/306798/4fd7021b-669f-3005-a7bb-b5baaffd5d56.jpg[/img]
通常整数n的取值是一个正数,如果为0则结果仍为m;如果为负数则等价于m/2d,其中d的取值为整数n类型的最小值的绝对值 – 整数n的绝对值。例如计算表达式“17>>-2 147 483 645”的结果,因为整数-2 147 483 645为int型,最小值为-2 147 483 648,所以m/2d中的d取值为2 147 483 648 – 2 147 483 645 = 3,所以表达式“17>>-2 147 483 648”等价于“17>>3”,最终结果为2。
下面的代码显示了移位运算符的用法:
int a = -2 <<3; //a的值为:-16,等价于(-2)*23
int b = 3 << -2147483646; //b的值为:12,等价于3*2147483646
int c = 15 >> 2; //c的值为:3,等价于15/22%32
int d = -31>>3; //d的值为:-4,等价于(-32)/23%32
int e = 4>>>2; //e的值为:1,等价于4/22%32
int f = -5>>>1; //f的值为:2147483645
代码中各表达式的运算符过程分别如图5~10所示:
[img]http://dl.iteye.com/upload/attachment/306756/f6393b76-f9d2-3048-a5d6-6558cad30623.jpg[/img]
[img]http://dl.iteye.com/upload/attachment/306758/2f87ec3b-7f72-3baf-b12d-e0fa76448e76.jpg[/img]
[img]http://dl.iteye.com/upload/attachment/306760/31215e7c-37dc-3d46-aafc-686b99de34ae.jpg[/img]
[img]http://dl.iteye.com/upload/attachment/306743/b08bd351-79a6-3485-8760-6eaf5f030625.jpg[/img]
Java语言中的位运算符又分为按位运算符和移位运算符,下面分别进行介绍。
1、按位运算符
按位运算符是将整数的二进制数据流中的每个位进行运算,该运算只包括以下4种:按位与运算、按位或运算、按位异或运算和按位取反运算,它们所对应的运算符及运算规则如下表1所示:
[img]http://dl.iteye.com/upload/attachment/306801/af9023e4-a3b7-3b47-91e2-60cb865efda6.jpg[/img]
按位与运算,只有两个二进制位数都为1时结果才为1;按位或运算,只要有一个二进制位数为1则结果为1;按位异或运算,两个二进制位数相同(同时为0或1)时结果为0,否则为1;按位取反运算符为一元运算符,取反运算是将二进制中的0修改为1,1修改为0。
下面的代码显示了按位运算符的用法:
int a = 5 & -4;//整数5与-4的按位与运算,结果为:4
int b = 3 | 6;//整数3与6的按位或运算,结果为:7
int c = 10 ^ 3;//整数10与3的按位异或运算,结果为:9
int d = ~(-14);//整数-14的按位取反运算,结果为:13
代码中各表达式的运算过程分别如图1~4所示:
[img]http://dl.iteye.com/upload/attachment/306749/773f491b-bff1-3b81-8b15-21954f27d43f.jpg[/img]
[img]http://dl.iteye.com/upload/attachment/306751/3a4acd24-8f2a-35a1-b434-a974b4f0c393.jpg[/img]
在Java中,按位运算符可以与赋值运算符“=”组合为复合赋值运算符,例如:
int num = 5;
num &= 6;//等价于:num = num & 6;
System.out.println(num);//运行结果为:4
当按位与和按位或运算符两边的操作元为布尔数据时,则被视为逻辑运算符。
例如以下的表达式是合法的:
int a = 3;
int b = 9;
System.out.println((a<b)&((a+4)>b));//输出结果:false
System.out.println((a<b)|((a+4)>b));//输出结果:true
2、移位运算符
移位运算符同样也是对整数的二进制中的位进行操作。Java中的移位运算符包括以下3种:左移位运算、有符号整数的右移位运算和无符号整数的右移位运算。它们所对应的运算符及运算规则如下表2所示:
[img]http://dl.iteye.com/upload/attachment/306798/4fd7021b-669f-3005-a7bb-b5baaffd5d56.jpg[/img]
通常整数n的取值是一个正数,如果为0则结果仍为m;如果为负数则等价于m/2d,其中d的取值为整数n类型的最小值的绝对值 – 整数n的绝对值。例如计算表达式“17>>-2 147 483 645”的结果,因为整数-2 147 483 645为int型,最小值为-2 147 483 648,所以m/2d中的d取值为2 147 483 648 – 2 147 483 645 = 3,所以表达式“17>>-2 147 483 648”等价于“17>>3”,最终结果为2。
下面的代码显示了移位运算符的用法:
int a = -2 <<3; //a的值为:-16,等价于(-2)*23
int b = 3 << -2147483646; //b的值为:12,等价于3*2147483646
int c = 15 >> 2; //c的值为:3,等价于15/22%32
int d = -31>>3; //d的值为:-4,等价于(-32)/23%32
int e = 4>>>2; //e的值为:1,等价于4/22%32
int f = -5>>>1; //f的值为:2147483645
代码中各表达式的运算符过程分别如图5~10所示:
[img]http://dl.iteye.com/upload/attachment/306756/f6393b76-f9d2-3048-a5d6-6558cad30623.jpg[/img]
[img]http://dl.iteye.com/upload/attachment/306758/2f87ec3b-7f72-3baf-b12d-e0fa76448e76.jpg[/img]
[img]http://dl.iteye.com/upload/attachment/306760/31215e7c-37dc-3d46-aafc-686b99de34ae.jpg[/img]