Java中位运算符主要针对二进制,它包括了:“与”、“非”、“或”、“异或”
1、 与运算符,也叫位与运算符
与运算符用符号“&”表示,其使用规律如下:
两个操作数中位都为1,结果才为1,否则结果为0。
比如 有两个整数int a = 128, int b = 129, 则 a & b = 128;
分析这个程序:
“a”的值是128,转换成二进制就是10000000,
“b”的值是129,转换成二进制就是10000001。
根据与运算符的运算规律,只有两个位都是1,结果才是1,可以知道结果就是10000000,即128。
2、 或运算符,也叫位或运算符
或运算符用符号“|”表示,其使用规律如下:
两个位只要有一个为1,那么结果就是1,否则就为0。
比如 有两个整数int a = 128, int b = 129, 则 a | b = 129;
分析这个程序:
“a”的值是128,转换成二进制就是10000000,
“b”的值是129,转换成二进制就是10000001。
根据与运算符的运算规律,只要有一个为1,那么结果就是1,可以知道结果就是10000001,即129。
3、 非运算符
非运算符用符号“~”表示,其运算规律如下:
如果位为0,结果是1,如果位为1,结果是0
4、 异或运算符
异或运算符是用符号“^”表示的,其运算规律是:
两个操作数的位中,相同则结果为0,不同则结果为1。
比如 有两个整数int a = 15, int b = 2, 则 a ^ b = 13;
分析上面的程序段:
a 的值是15,转换成二进制为1111,
b 的值是2,转换成二进制为0010,
根据异或的运算规律,可以得出其结果为1101 即13。
5、 Java中&、|、&&、||区别
<1> & 和 |既是位运算符又是逻辑运算符,&的两侧可以是int,也可以是boolean表达式。
当&和|两侧是int时,要先把运算符两侧的数转化为二进制数再进行运算。
而短路与和或(&&和||)的两侧要求必须是布尔表达式。
<2> 对于&:无论&左边是否为false,他都会继续检验右边的boolean值。
对于&&:只要检测到左边Boolean值为false时,就会直接判断结果,不会在检验右边的值。
比如:
int i = 0;
if(3>4 && (++i)>0){
System.out.println("成立时i的值" + i);
}else{
System.out.println("不成立时i的值" + i);
}
结果为:不成立时i的值0
if(3>4 & (++i)>0){
System.out.println("成立时i的值" + i);
}else{
System.out.println("不成立时i的值" + i);
}
结果为:不成立时i的值1
分析:
当使用&&时先判断左边的表达式发现3>4为false,就不会再检验右边的结果直接执行else中的语句
当使用&时先判断左边的表达式发现3>4为false,依然会去执行右边的表达式先++i得到i=1,i>0为true,但于的运算规则是有一个为false即为false,则执行else中的语句。
对于|:无论左边是否为ture,都会检验右边
对于||:只要检测到左边Boolean值为true时,就会直接判断结果,不会在检验右边的值。
比如:
int j = 0;
if(3>2 || (++j)>1){
System.out.println("成立时j的值" + j);
}else{
System.out.println("不成立时j的值" + j);
}
结果为:成立时j的值0
if(3>2 | (++j)>1){
System.out.println("成立时j的值" + j);
}else{
System.out.println("不成立时j的值" + j);
}
结果为:成立时j的值1
分析:
当使用||时先判断左边的表达式发现3>2为true,就不会再检验右边的结果直接执行true中的语句
当使用|时先判断左边的表达式发现3>2为true,依然会去执行右边的表达式先++j得到j=1,j>1为false,但或的运算规则是有一个为true即为true,则执行true中的语句。
6、 左移运算符(<<)
将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。
a = a << 2 将a的二进制位左移2位,右补0,
左移1位后a = a * 2;
若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。即 a << m 则 a = a * 2的m次方
比如 int a = 2; a = a << 2 则 a = 8
分析如下:
2转为二进制 0000 0000 0000 0000 0000 0000 00000 0010
左移2位 0000 0000 0000 0000 0000 0000 00000 1000
7、 右移运算符(>>)
将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。
操作数每右移一位,相当于该数除以2。
b = b >> 2 将b的二进制位右移2位,
左补0 or 补1 得看被移数是正还是负。
右移一位相当于除2,右移n位相当于除以2的n次方。即 b << n 则 b = b / 2的n次方
比如 int b = 11; b = b >> 2 则 b = 2
分析如下:
11转为二进制 0000 0000 0000 0000 0000 0000 00000 1011
右移2位 0000 0000 0000 0000 0000 0000 00000 0010
8、 无符号右移运算符(>>>)
忽略了符号位扩展,0补最高位 无符号右移运算符>>> 只是对32位和64位的值有意义
按二进制形式把所有的数字向右移动对应位数,低位移出(舍弃),高位的空位补零
9、 复合赋值运算符
位运算符与赋值运算符结合,组成新的复合赋值运算符,它们是:
&= 例:a &= b 相当于a=a & b
|= 例:a |= b 相当于a=a | b
>>= 例:a >>= b 相当于a=a >> b
<<= 例:a <<= b 相当于a=a << b
^= 例:a ^= b 相当于a=a ^ b
运算规则:和前面讲的复合赋值运算符的运算规则