Java(三)
Java基础(二)
整数运算
Java的整数运算遵循四则运算的规则
两个整数相除,只能得到整数部分; eg: int x = 45/2; //27
求余运算使用%; eg: int y = 45%2; //1
整数的除法对于除数为0时,编译不会报错,运行会报错
溢出
整数计算超出范围限制,就会产生溢出,溢出时不会报错,但是会有奇怪的结果
解决int溢出的问题,可以把类型定义为long
简写运算法:+=,-=,*=,/=
自增、自减
++n:表示先+1再引用n;
n++:表示先引用n,再+1;
移位运算
左移 <<:不断的✖️2
右移 >>:不断的➗2
无符号右移运算 >>>:右移后高位总是补0,因此负数右移后会变成一个正数
对byte和short进行移位时,会先转成int
位运算
与、或、非、异或的运算
与运算的规则:两个数同时为1,结果为1
a = 0&0;//0
a = 0&1;//0
a =1&0;//0
a =1&1;//1
或运算规则:一个数为1,结果为1
a = 0&0;//0
a = 0&1;//1
a =1&0;//1
a =1&1;//1
非运算规则:0和1互换
a = ~0;//1
a = ~1;//0
异或运算规则:两个数不同,结果为1,两个数相同结果为0
a = 0&0;//0
a = 0&1;//1
a =1&0;//1
a =1&1;//0
对正数进行位运算,先转化为二进制,位数不足的用0补齐,然后按位对齐,依次对每一位进行运算
eg:a = 167776589 ==> 00001010 00000000 00010001 01001101 ==>10.0.17.77
b = 167776512 ==> 00001010 00000000 00010001 00000000 ===>10.0.17.0
a&b = 167776512==> 00001010 00000000 00010001 00000000 通过与运算,可以判断一个Ip是否在给定的网段内
运算优先级
()
!
~
++
--
*
/
%
+
-
<<
>>
>>>
&
|
+=
-=
*=
/=
类型自动改提升与强转
int i =12345;
short s = (short) i; 把int型的i强制转化为short,大范围强制转为小范围的整型时,可能会报错
public class Test { /** * 计算前n个自然数的和 * ((1+N)*N)/2 */ public static void main (String[] args){ int n = 10000; int s = ((1+n)*n)/2; System.out.println("前n个自然数的和:"+s); System.out.println(s == 50005000 ? "测试通过":"测试失败"); } }
浮点数运算
浮点数只能进行四则运算;
浮点数无法精确表示;
浮点数的比较方法:判断两个浮点数之差的绝对值是否小于一个很小的数(eg:0.00001
)
类型提升
如果计算的两个数,其中一个是整型,那么整型会自动提升到浮点型
溢出
整数运算在除数为0时编译不会报错,运行会报错,在浮点数运算时,不会报错,但是会返回异常值
double d1 = 0.0/0;//NaN Not a Number
double d1 = 1.0/0;//Infinity 表示无穷大
double d1 = -1.0/0;//-Infinity 表示负无穷大
强制转型
浮点数强转为整型时,小数部分会被舍弃,如果转出来的大于整型的取值范围,会给出整型的最大值;如果要对小数部分进行四舍五入,需要加上0.5,再强转
eg:double d = 2.6;
int n = (int)(d+0.5);
public class Test { /** * 计算一元二次方程的两个解:ax^2+bx+c = 0 * */ public static void main (String[] args){ double a = 1.0; double b = 3.0; double c = -4.0; double result1 = (-b+Math.sqrt(Math.pow(b,2)-4*a*c))/(2*a); double result2 = (-b-Math.sqrt(Math.pow(b,2)-4*a*c))/(2*a); System.out.println("result1的值为:"+result1); System.out.println("result2的值为:"+result2); System.out.println(result1 == 1 && result2 == -4 ? "测试通过":"测试失败"); } }
布尔运算
布尔只有true和false
比较运算符:>,>=,<,<=,==,!=; 与运算符:&&; 或运算符:| |; 非运算符:! ;
关系运算符的优先级:!大于>,>=,<,<= 大于==,!= 大于 && 大于 | |
短路运算
短路运算是布尔运算重要的一个特点。如果一个布尔运算的表达式能提确定结果,则后续的的计算不执行 ,因为false && xx的结果始终是false
public class Tesr { public static void main(String[] args) { boolean b = 5 < 3; boolean result = b && (5 / 0 > 0); System.out.println(result); } }
如果没有短路运算,该程序执行的时候会因为&&后面的除数为0而报错,但是由于短路运算的存在,程序执行的结果为false
三元运算符
b ? x : y :根据第一个布尔表达式的结果,分别返回后续两个表达式之一的计算结果
先算b,如果b为true,则只计算x,否则只计算y
public class Test { /** * 判断年龄是否是小学生(6~12岁) */ public static void main (String[] args){ int age = 22; boolean isPrimaryStudent = age >6 && age < 12; System.out.append(isPrimaryStudent ? "yes":"NO"); } }