java基础学习笔记day05(位运算符、运算符优先级)

java基础学习笔记day05(位运算符、运算符优先级)

第一章 接上篇运算符讲位运算符和条件运算符

1.1、位运算符

在java中位运算符有&、|、^、~、>>、<<、>>。在java程序中,进行位运算就是拿操作数的二进制进行运算。

1.1.1、按位&

按位& 1 0
1 1 0
0 0 0

看如下代码:

public class Demon01{
    public static void main(String[] args){
         System.out.println(5&-3); //结果是5        
         System.out.println(5&3); //结果是1
    }
}

总结

  • 二进制运算都是补码运算
  • 运算时符号位也会参与运算
  • 一个数字如何按位&1,其结果为1时那么当前该数字后一位[二进制中]则为1

1.1.2、按位|

按位| 1 0
1 1 1
0 1 0

看如下代码:

public class Demo02{    
	public static void main(String[] args){        
		System.out.println(5|3); //7    
	} 
}

总结

  • 二进制运算都是补码运算
  • 运算时符号位也会参与运算

1.1.3、按位异或^

按位异或^ 1 0
1 0 1
0 1 0=

看如下代码:

int num1 = 10; 
int num2 = 20;
/**第一种交换方式 借助第三方变量 
int temp = 0; 
temp = num1;
num1 = num2; 
num2 = temp; 
第一种交换方式 通过异或^ 
逻辑 
int temp = num1^num2; 
num1 = temp^num1;num1^num2^num1 
num2 = temp^num2;num1^num2^num2
*/
num1 = num1^num2;
num2 = num1^num2;//num1^num2^num2 
num1 = num1^num2;//num1^num2^num1

总结

  • 两个相同的数字进行 ^ 运算,其结果就是0。
  • 0和任何数字进行 ^ 运算,结果就是对应数字。
  • 两个变量互相 ^ 三次,就可以互相交换位置。

1.1.4、按位~

按位~ 1 0
0 1

看如下代码:

System.out.println(~5); //-6

java基础学习笔记day05(位运算符、运算符优先级)_第1张图片

1.1.5、按位左移<<

看如下代码:

System.out.println(-2<<3);//-16 
System.out.println(2<<3);//16

java基础学习笔记day05(位运算符、运算符优先级)_第2张图片

  • 一个数字左移N位,相当于当前这个数字*2N次方
  • 当一个数字左移N位,而且N超过了数字类型的取值范围,相当于左移 num<<(N%32)
  • 左移之后不论正负,都是通过 0 填充

1.1.6、按位右移>>

看如下代码:

//按位右移 
System.out.println(8>>2);// 2
System.out.println(-8>>2);//-2

java基础学习笔记day05(位运算符、运算符优先级)_第3张图片

  • 当一个数字(a)右移N位之后,就是除以当前数字的除以2的N次方 a>>N => a/2^N
  • 右移之后如果当前数字是正数,那么填补空位通过 0 ,反之通过 1 填补,就是填补空位通过当前数 字的 符号位

1.1.7、无符号按位右移>>>

看如下代码:

System.out.println(-8>>2); 
System.out.println(-8>>>2);
System.out.println(8>>2); 
System.out.println(8>>>2);
  • 当一个正数进行无符号右移操作时和右移操作的结果是一样的。
  • 当一个负数进行无符号右移操作时得出的结果一定是一个正数。
  • 无符号右移填补空位全部都是通过 0 填补。

1.2、条件运算符

条件运算符的表达形式:

表达式1?表达式2:表达式3;
  • 表达式1 的结果一定是一个boolean类型的值。
  • 条件运算符也是三目运算符,可以连接三个操作数。

看如下代码:

import java.util.Scanner; 
public class Demo04{    
	public static void main(String[] args){        
        //声明Scanner类型的变量        
        Scanner input = new Scanner(System.in);        
        System.out.println("==请输入用户名===");        
        int uname = input.nextInt();        
        //2:声明一个变量方法存储的用户名        
        int regUname = 123;        
        //3:输出 如果用户名相同则输出恭喜登录成功 反之 用户名或者密码错误        
        String msg = uname==regUname?"恭喜登录成":"用户名或者密码错误";        		        		System.out.println(uname==regUname?"恭喜登录成":"用户名或者密码错误");            
    } 
}

执行顺序:

  • 首先计算表达式1的值,如果表达式1的值是true,整个条件运算符的结果是表达式2的值;
  • 如果表达式1 的值是false,那么整个条件运算符的结果是表达式3的值。
  • 注意:条件运算符后会计算出来一个结果,对于该结果而言,要么直接输出,要么通过变量存 储,否则编译会出错。
  • 条件运算符在一定程度上帮助我们解决流程控制的问题,可以代替一部分后续学习的if语句。

第二章、运算符的优先级

2.1、运算符优先级

  • 跟着感觉走
  • 实在拿不准,括号无敌。
  • 算数>比较>逻辑>=赋值符号优先级别低 扩展运算符

2.2、运算符优先级深入

单目>双目>三目

java基础学习笔记day05(位运算符、运算符优先级)_第4张图片

执行顺序:

  • 先括号>算数>位>关系>逻辑>三目>扩展、赋值
  • 算数: ++ – > * / % >+
  • 关系: > < >= <= > == !=
    括号无敌。
  • 算数>比较>逻辑>=赋值符号优先级别低 扩展运算符

2.2、运算符优先级深入

单目>双目>三目

[外链图片转存中…(img-uj9FqKEo-1569733566187)]

执行顺序:

  • 先括号>算数>位>关系>逻辑>三目>扩展、赋值
  • 算数: ++ – > * / % >+
  • 关系: > < >= <= > == !=
  • 逻辑:! > & | ^ > && ||

你可能感兴趣的:(我的java基础学习)