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
1.1.5、按位左移<<
看如下代码:
System.out.println(-2<<3);//-16
System.out.println(2<<3);//16
- 一个数字左移N位,相当于当前这个数字*2N次方
- 当一个数字左移N位,而且N超过了数字类型的取值范围,相当于左移 num<<(N%32)
- 左移之后不论正负,都是通过 0 填充
1.1.6、按位右移>>
看如下代码:
//按位右移
System.out.println(8>>2);// 2
System.out.println(-8>>2);//-2
- 当一个数字(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、运算符优先级深入
单目>双目>三目
执行顺序:
- 先括号>算数>位>关系>逻辑>三目>扩展、赋值
- 算数: ++ – > * / % >+
- 关系: > < >= <= > == !=
括号无敌。 - 算数>比较>逻辑>=赋值符号优先级别低 扩展运算符
2.2、运算符优先级深入
单目>双目>三目
[外链图片转存中…(img-uj9FqKEo-1569733566187)]
执行顺序:
- 先括号>算数>位>关系>逻辑>三目>扩展、赋值
- 算数: ++ – > * / % >+
- 关系: > < >= <= > == !=
- 逻辑:! > & | ^ > && ||