Java基础3:Java运算符及其原理分析

1. 自增自减运算符: ++ 和 --

 public static void main(String[] args) {

   int x=10,y =2;

   int result= y *++x;

   System.out.println("result = "+result);

   System.out.println("x = "+ x);

}

运行结果:

result = 22 ; x = 11

int result = y * x++;改成int result =y *++x;

运行结果: result = 20 ; x = 11

运行结果分析:

++x先执行x的自增操作,然后执行 y * x , 赋值给result;

x++ 先执行y*x , 赋值给result , 然后执行x的自增操作

关系运算符: > , <  , >= , <=,== , != , 返回结果 true 或者false


2. 三目运算符: 

public static void main(String[] args) {

   System.out.println('a'==97?"true":"false");

}

运行结果: true

3. 逻辑运算符: &&和|| , & 和 |

public static void main(String[] args) {

   int a=10;

   if (a > 100 && (a / 0) > 0) {

        System.out.println("执行了if");

   }else{

        System.out.println("执行了else");

   }

}

运行结果:

执行了else

if (a > 100 && (a / 0) > 0)修改为if(a >100& (a/ 0) >0)

运行结果: Exception in thread "main"java.lang.ArithmeticException: / by zero

运行结果分析:

&&只要有一个返回false, 整个表达式返回false , 不需要执行后面的表达式 , &运算符会继续执行下面的表达式。


4. 位运算:&(与) , |(或) , ~(非) , ^(异或) ,>>(右移) , <<(左移) , >>>(无符号右移) ,<<<(无符号左移 ,java中不存在)

    1. 与运算(num1 & num2):两个二进制位都为1 ,则返回1 ,否则返回0

    2. 或运算(num1 | num2):两个二进制位都为0 , 则返回0 ,否则返回1

    3. 异或运算(num1 ^ num2):两个二进制位不同 ,则返回1 ,否则返回0

    4. 非运算(~num): num对应的二进制位为1 , 则返回0 , 如果为0 , 则返回1

    5.左移(num << value):二进制数字num向左移动value对应的位数 ,高位也就是符号位移出(舍弃) , 0补最低位。数字没有溢出的前提下,左移一位都相当于乘以2,左移n位就相当于乘以2n

    6. 右移(num >> value):二进制数字num向右移动value对应的位数 ,符号位不变 , 如果num是负数,每一次右移都在左边补1,如果num为正数,每一次右移都在左边补0,这叫做符号位扩展(保留符号位)。右移一位相当于除2,右移n位相当于除以2n

    7. 无符号右移(num >>> value):二进制数字num向右移动value对应的位数 ,符号位也就是最高位用0补位

    8. 无符号左移(num<<<value):java中没有无符号左移的运算符 , 因为左移运算符就是无符号左移

    9. 注意有以下几种比较特殊的情况:

 - 如果移动的位数value超过了该类型的最大位数,那么编译器会对移动的位数取模。如对int型移动33位,实际上只移动了33 % 32 = 1位。

 - 如果移动的位数value为负数 ,  对于int类型java取的是位移的value最低五位的数值 , 也就是最大值位31 , 对于long型取得是位移的value最低6位的数值 ,也就是最大值是63 , 那么编译器会移动(该类型的最大位数 + value) 位。如对int型移动-2位,实际上移动了31 + (-2) + 1 = 30位

 - 正数右移到最后 , 结果为0 , 负数右移到最后 , 结果为-1(按补码进行位移分析)

 - 位移之后 , 会将byte , short等范围小的类型转换为int类型

public static void main(String[] args) {

   int num1=9,num2 =5;

   int result = num1 & num2;

   System.out.println("result = "+result);

}

运行结果 :

result = 1

int result = num1 & num2;修改为int result = num1| num2;运行结果 : result = 13

int result = num1 & num2;修改为int result = num1 ^ num2;运行结果 : result = 12

结果分析:

9 表示为二进制是 00001001 (为了清楚可见 , 忽略前面24个0)

5 表示为二进制是 0000 0101 (为了清楚可见 ,忽略前面24个0)


public static void main(String[] args) {

    int x = 16;

    int result = x << -31;

    System.out.println("result= "+ result);

}

运行结果: result = 32

结果分析: 左移 -31位相当于左移1位 , 就是乘以2

 

public static void main(String[] args) {

    int x = -16;

    int result = x >>>2;

    System.out.println("result= "+ result);

}

运行结果: result = 1073741820

结果分析:

  1. x转换为二进制位 10000000 00000000 00000000 00010000 ,
  2. 在计算机中保存的是补码 11111111 11111111 11111111 1111 0000 ,
  3. 无符号右移2位之后的值为 00111111 111111111111 1111 1111 1100
  4. 将其转为10进制 就是107374182

猜你喜欢

转载自blog.csdn.net/gethinyang/article/details/79194396