java的运算符,分为四类:
算术运算符 + - * / % ++ –
关系运算符 == != > >= < <=
逻辑运算符 && || ! & | ^
位运算符 & | ~ ^ >> << >>>
逻辑运算符
public static void main(String args[]) {
int a = 1, b = 3;
if (a == 2 & (b = b + 2) > 3) {
System.out.println("&"); //第一个条件(a==2)判断失败,会继续判断第二个条件
}
System.out.println("没有短路,b=" + b);//没有短路,b=5
if (a == 2 && (b = b + 2) > 3) {
System.out.println("&&"); //第一个条件(a==2)判断失败,不会继续判断第二个条件
}
System.out.println("短路了,b=" + b);//短路了,b=5
}
java、位移操作符
注意,位移指的是二进制位的位移。
一共分为三种:
-
>> 有符号右移/算数右移
规则:低位丢弃,高位补符号位。
// 练习 System.out.println(10 >> 2); //2 System.out.println(-10 >> 2); // -3
注意:负数进行位操作都是按照补码进行操作的。 -10的补码:11110110 10的补码 00001010 右移两位: 11111101 右移两位:00000010 减1变反码:11111100 2 取反变原码:10000011 对应十进制为:-3
-
>>> 无符号右移/逻辑右移
规则:低位丢弃,高位直接补零。
System.out.println(10 >>> 2); //2 System.out.println(-10 >>> 2); //1073741821
-10的补码:11111111 11111111 11111111 11110110 右移两位: 00111111 11111111 11111111 11111101 对应十进制为:1073741821
-
<< 左移
规则:高位丢弃,低位补0。
System.out.println(10 << 2); // 00101000 -> 40 System.out.println(25 << 2); // 01100100 -> 100 System.out.println(30 << 4); // 480 // 思考:左移的实质是什么? 右移x位相当于乘以2^x
-
& 位与
两个操作数的位都为 1,结果才为 1,否则结果为 0
public static void main(String args[]) { System.out.println(Integer.toBinaryString(2));// 10 System.out.println(Integer.toBinaryString(5));//101 System.out.println(2&5); //0 System.out.println(Integer.toBinaryString(-2)); //11111111111111111111111111111110 System.out.println(Integer.toBinaryString(-5)); //11111111111111111111111111111011 System.out.println((-2)&(-5)); //11111111111111111111111111111010 -6 }
-
~ 位非
操作数的位如果为 0,结果是 1,如果为 1,结果是 0。
public static void main(String args[]) { System.out.println(Integer.toBinaryString(2)); //00000000000000000000000000000010 System.out.println(~2); //11111111111111111111111111111101 -3 System.out.println(Integer.toBinaryString(-5)); //11111111111111111111111111111011 System.out.println(~(-5)); //00000000000000000000000000000100 4 }
-
| 位或
两个操作数的位只要有一个为 1,那么结果就是 1,否则就为 0
public static void main(String args[]) { System.out.println(Integer.toBinaryString(2));// 10 System.out.println(Integer.toBinaryString(5));//101 System.out.println(2|5); //111 System.out.println(Integer.toBinaryString(-2)); //11111111111111111111111111111110 System.out.println(Integer.toBinaryString(-5)); //11111111111111111111111111111011 System.out.println(Integer.toBinaryString(-1)); //11111111111111111111111111111111 System.out.println((-2)|(-5)); //-1 }
-
^ 位异或
两个操作数的位相同时结果为 0,不同时结果为 1
public static void main(String args[]) { System.out.println(Integer.toBinaryString(2));// 10 System.out.println(Integer.toBinaryString(5));//101 System.out.println(2^5); //111 7 System.out.println(Integer.toBinaryString(-2)); //11111111111111111111111111111110 System.out.println(Integer.toBinaryString(-5)); //11111111111111111111111111111011 System.out.println(Integer.toBinaryString(5)); //00000000000000000000000000000101 System.out.println((-2)^(-5)); //5 }