<<,>>,>>>代表java中的移位运算符
- "<<"表示左移运算符
例如8<<2,表示将8向左移2位,结果为32。低位补0。
8的二进制:1 0 0 0
向左移动两位结果为1 0 0 0 0 0,换算成十进制即为32,也可以简单的理解为,左移就是将数变大,相当于8*2^2=32。
左移运算符的运算规律:将左边的数按照右边的数往左移动几位。 - ”>>”表示带符号右移运算符
例如 8>>2,表示将8向右移动2位,结果为2。高位补0。
8的二进制:1 0 0 0
向右移动两位:0 0 1 0即为2,也可以简单的理解为将数向右移位就是将数变小,相当于8除以2^2=2。
右移运算符运算规律:将左边的数按照右边的数右移几位。 - ”>>>”表示无符号右移运算符。高位补0
例如8>>>2表示将8向右移位2位,结果为2。
示例代码
int a = 8 << 2;
int b = 8 >> 2;
int c = 8 >>> 2;
System.out.println(a);//输出为32
System.out.println(b);//输出为2
System.out.println(c);//输出为2
>>和>>>的区别
对于正数而言,>>和>>>没有任何区别。
对于负数而言,例如-2>>1。-2的二进制为1000 0000 0000 0010,-2>>1后为1000 0000 0000 00001,即值为-1
而-2>>>1代表如下:即值为2147483647
代码实例
package com.rong.map;
public class Test01 {
public static void main(String[] args) {
int a1 = 2 >> 1;
int b1 = -2 >> 1;
System.out.println(a1);//输出为1
System.out.println(b1);//输出为-1
int a2 = 2 >>> 1;
int b2 = -2 >>> 1;
System.out.println(a2);//输出为1
System.out.println(b2);//输出为2147483647
}
}
&&和&的区别
- Java中&&和&都是表示与的逻辑运算符,都表示逻辑运算符and,当两边的表达式都为true的时候,整个运算结果才为true,否则为false。
- &&的短路功能,当第一个表达式的值为false的时候,则不再计算第二个表达式;&则两个表达式都执行。
- &可以用作位运算符,当&两边的表达式不是Boolean类型的时候,&表示按位与操作。
示例代码(按位与)
package com.rong.map;
public class Test01 {
public static void main(String[] args) {
/**
* 5的二进制数为0101
* 6的二进制数为0110
* 所以a按位与后0100
*/
int a = 5&6;
System.out.println(a);//所以a这里输出为4
}
}
I和||的区别
- Java中||和|都是表示与的逻辑运算符,都表示逻辑运算符or,只要有一边为true(或者两边都为true),则整个逻辑运算为true
- ll的短路功能,当第一个表达式的值为true的时候,则不再计算第二个表达式;|则两个表达式都执行。
- |可以用作位运算符,当&两边的表达式不是Boolean类型的时候,|表示按位或操作。
示例代码(按位或)
package com.rong.map;
public class Test01 {
public static void main(String[] args) {
/**
* 5的二进制数为0101
* 6的二进制数为0110
* 所以a按位或后0111
*/
int a = 5|6;
System.out.println(a);//所以a这里输出为7
}
}
^(按位异或)
- java中的^代表的是按位异或的操作
- Java中的^也可以表示逻辑运算符,^的两边的表达式必须一边为true一边为false才会执行,都为true或都为false都不会执行
示例代码
package com.rong.map;
public class Test01 {
public static void main(String[] args) {
if(3>2 ^ 3<3) {
System.out.println("hello");//输出hello
}
/**
* 5的二进制数为0101
* 6的二进制数为0110
* 即a按位异或后0011
*/
int a = 5^6;
System.out.println(a);//所以a这里输出为3
}
}
~(按位非)
~在java中代表的是按位非的操作
对一个数来说,例如8,则求~8的步骤为:
(1).8的二进制为0000 0000 0000 1000
(2).对其取反 1111 1111 1111 0111 (包括符号位)
(3)再对其取反 1000 0000 0000 1000 (不包括符号位)
(4).对其加1 1000 0000 0000 1001
所以~8 = -9
package com.rong.test;
public class Test {
public static void main(String[] args) throws InterruptedException {
int a = ~2;
//2的原码是0000 0000 0000 0010
//2先取反为1111 1111 1111 1101
//再除符号位取反1000 0000 0000 0010
//再对其加1000 0000 0000 0011
System.out.println(a);//这里输出则为-3
}
}
需要注意的地方
如果你碰见n |= n+1或n ^=n+1,不用惊慌,其实和n +=n+1一样
n |= n+1就等于n = n | (n+1);
n ^= n+1就等于n = n ^ (n+1);