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");
    }
}

 

posted @ 2021-03-04 18:14  小小日常  阅读(77)  评论(0编辑  收藏  举报