java逻辑运算符
java的逻辑运算符分为四种:
1.逻辑且&
2.逻辑或|
3.逻辑异或^
4.逻辑非!
int x = 10;
int y = 10;
boolean result1 = ++x < 5 & ++y < 5;
System.out.println(x);//11
System.out.println(y);//11
但是这种逻辑运算符效率非常低,他会同时执行两边,所以x和y都会++变成11
java短路运算符
使用java短路运算符,具有短路效果(当左边的表达式能够确定最终结果,那右边的表达式就不会参与运行)
java短路运算符分为两种:
1.短路且&&
2.短路或||
int a = 10;
int b = 10;
boolean result2 = ++a < 5 && ++b < 5;
System.out.println(a);//11
System.out.println(b);//10
左边的a先++后是11,由于11<5已经为false,所以右边不会在执行,b也就不会++了
原码、反码、补码
1.原码:十进制数据的二进制表现形式,最左边是符号位,0为正,1为负
缺点:使用原码进行计算的时候,正数不会出错;但负数会出错,因为符号位的缘故,实际运算的方向,跟正确的运算方向相反。
例:
-0: 1000 0000
-0+1:1000 0001-->-1(与正确答案+1运算方向相反)
2.反码:为了解决原码不能计算负数而出现
计算规则:正数的反码不变;负数的反码在原码的基础之上,符号位不变,数值取反,0变1,1变0。
缺点:负数计算时,如果不跨0是正确;但如果结果跨0,由于0的反码有两个(+0和-0),所以计算结果会跟实际结果相差1(-1 + 1 = -0,-1 + 2 = +0)
例:
-1:1111 1110
-1+2:1111 1110 + 0000 0010 = 0000 0000 --> 0(与正确答案1相差1)
3.补码:为了解决负数计算时跨0的问题而出现的
计算规则:正数补码不变;负数在反码的基础上+1
注意点:
①计算机中的存储和计算都是以补码的形式存在的
②byte类型(8位/1个字节)的所能存储的最大值是127(补码:0111 1111),但最小值是-128(补码:1000 0000)。因为补码的缘故,使得原本-0的位置被-1所利用,所以原本最小值1111 1111(-127)的位置,被-128所利用,使得最小值变为-128。
③虽然-128没有原码和反码,但是没有影响,因为计算机都是以补码的形式进行存储和计算的
接下来,再回到逻辑运算符(0为false,1为true)
1.逻辑与& --> 两个数补码的对应位置都为1才是1,否则为0
int n1=200; //0000 0000 0000 0000 0000 0000 1100 1000
int n2=10; //0000 0000 0000 0000 0000 0000 0000 1010
System.out.println(n1 & n2);//0000 0000 0000 0000 0000 0000 0000 1000 --> 8
2.逻辑或| --> 两个数补码的对应位置都为0,才是0,否则为1
int n1=200; //0000 0000 0000 0000 0000 0000 1100 1000
int n2=10; //0000 0000 0000 0000 0000 0000 0000 1010
System.out.println(n1 | n2);//0000 0000 0000 0000 0000 0000 1100 1010 --> 202
左移、右移、无符号右移
1.左移<<
补码向左移动,低位补0(简便算法:左移一次就*2)
int n=200; // 0000 0000 0000 0000 0000 0000 1100 1000
System.out.println(n << 2);// 00 0000 0000 0000 0000 0000 1100 100000
//-->0000 0000 0000 0000 0000 0011 0010 0000 --> 800
2.右移>>
补码向右移动,高位补0或1(原来是正数,就补0;是负数,就补1-->简便算法:右移一次就/2)
int n=200; // 0000 0000 0000 0000 0000 0000 1100 1000
System.out.println(n >>2);// 000000 0000 0000 0000 0000 0000 1100 10
//-->0000 0000 0000 0000 0000 0000 0011 0010 --> 50
3.无符号右移>>>
补码向右移动,高位补0(不论正负)