0、运算符(二)
1. ++ 自增 --自减
1) ++ 和 – 为单目运算符,只对一个元素作运算,且只能用于变量,不能用于字面值和常量
2) 单独使用时, ++(–)在变量前后没有区别
3) 当参与运算时, ++(–)在变量前,则先让变量 +1(-1),在参与运算; ++(–)在变量后,则先使用原来变量的值参与运算,再让变量的值 +1(-1)
int a = 1;
System.out.println(a++); // 输出为 : 1
a = 1;
System.out.println(++a); // 输出为 : 2
4) 对于 ++(–)底层实现的理解
eg : num++ 等价于 num = (type) (num + 1);
2. 赋值运算符 :
= += -= *= /= %=
int a = 1;
a+=1; // 等价于 a = a + 1;
int b = 4;
b/=2; //等价于 b = b / 2;
注意 : 赋值运算符的优先级是最低的
3. 关系运算符(比较运算符)
> < >= <= ==(等于) !=(不等于)
注意 : 结果一定为 boolean 类型(true 或 false)
在 Java 中,= 为赋值运算符,而 == 才是等于
4. 逻辑运算符
& | !(非) ^(异或) &&(短路与) ||(短路或)
特点 : 针对布尔型来做运算符,运算结果为 boolean 类型
“&&(短路与)” :若左边表达式为false则不会对右边的表达式进行判断,因为结果必为false;
“||(短路或)” : 若左边表达式结果为true则不会对右边的表达式进行判断,因为结果必为true。
短语的逻辑运算符相当于普通的逻辑运算符效率更高些。
int a = 1,b = 2;
if (a++ < 0 & b++ > 2){}
System.out.println(a + " " + b);//2 3
a = 1; b = 2;
if (a++ < 0 && b++ > 2){}
System.out.println(a + " " + b);//2 2
5. 三目运算符
格式 :表达式 ? 表达式1 : 表达式2
注意 : 1) 符号要为英文半角符
2) 表达式的结果要求必须为 boolean(true 或 false)
执行流程 : 先执行问号前边的表达式,如果为 true 则执行表达式1,如果为 false 则执行表达式2
三目表达式可以嵌套使用 :例如 :
表达式 ? 表达式1 : (表达式 ? 表达式2 : 表达式3)
6. 位运算符
&(按位与) |(按位或) ~(按位取反) ^(按位异或) <<(左移) >>(带符号右移) >>>(不带符号右移)
① &(按位与)
概述 :将两个运算的整数转为二进制,按位执行与运算;当两位都为 1 时,结果为 1;如果有 0 ,则结果为 0
eg : 1 & 2
1 :0000 0000 0000 0000 0000 0000 0000 0001
2 :0000 0000 0000 0000 0000 0000 0000 0010
1 & 2 :0000 0000 0000 0000 0000 0000 0000 0000 ==> 0
注意 : 最高位为符号位 : 0 为 正数, 1 为 负数
计算机中数据存储和计算都是基于二进制补码
二进制 :正数 : 原码 = 反码 = 补码
负数 :原码 : 将其他进制的数直接转为二进制
反码 : 在原码的基础之上,符号位不变,其他位取反
补码 : 在反码的基础上 +1
② |(按位或)
概述 :将两个运算的整数转为二进制,按位执行或运算;当两位都为 0 时,结果为 0;如果有 1,结果为 1
③ ~(非 / 按位非)
概述 :单目运算符,对 1 取反为 0;对 0 取反为 1
eg : ~(-1)
-1 原码 :1000 0000 0000 0000 0000 0000 0000 0000
反码 :1111 1111 1111 1111 1111 1111 1111 1110
补码 :1111 1111 1111 1111 1111 1111 1111 1111
>按位取反 :
~(-1):0000 0000 0000 0000 0000 0000 0000 0000 ==> 0
④ ^(按位异或)
概述 :将两个运算的整数转为二进制,按位执行异或运算;如果两位相等则为 0,如果两位不相等则为 1
⑤ <<(左移运算符)
格式 :a << b 将 a 整数左移 b 位
概述 :先将整数转为二进制,然后将二进制数整体向左移动相应的位数,左侧多出来的位数直接舍弃,右侧空出来的位数补 0
eg : 2 << 1
2 : 0000 0000 0000 0000 0000 0000 0000 0010
2 << 1 : 0 0000 0000 0000 0000 0000 0000 0000 010 0 ==> 4
在一定范围内, a << b 等价于 a * 2b
⑥ >>(右移运算符)
格式 :a >> b 将 a 整数右移 b 位
概述 :先将整数转为二进制,然后将二进制数整体向左移动相应的位数,右侧多出来的位数直接舍弃,左侧空出来的位数,如果当前为负数则补 1,如果当前为正数则补 0
eg : -2 >> 1
-2 :原码 :1000 0000 0000 0000 0000 0000 0000 0010
反码 :1111 1111 1111 1111 1111 1111 1111 1101
补码 :1111 1111 1111 1111 1111 1111 1111 1110
-2 >> 1:1111 1111 1111 1111 1111 1111 1111 1111 0 (补码)
1111 1111 1111 1111 1111 1111 1111 1110 (反码)
1000 0000 0000 0000 0000 0000 0000 0001 (原码)
-2 >> 1 :结果为 -1
在一定范围内, a >> b 等价于 a / (2b)
⑦ >>>(无符号右移)
格式 :a >>> b 将 a 整数向右无符号移动 b 位
概述 :先将整数转为二进制,然后将二进制数整体向右移动相应的位数,右侧多出来的位数直接舍弃,左侧空出来的位数补 0
int a = -1;
System.out.println(a >> 32); // -1
System.out.println(a >>> 32); // -1
System.out.println(a << 32); // -1
//当一个整数,左移或右移其类型二进制位数的整数倍时,还是等于其原数值
1、补充知识点
1) + 求和; 拼接字符串
当字符串和基本数据类型拼接时, + 号左边或者右边有字符串类型时,这个 + 号就为拼接字符串功能; 当 + 号左右两边都为数值类型时, 这个 + 号就为求和功能;
System.out.println(1 + 2 + "HelloWorld"); //3HelloWorld
System.out.println(1 + "" + 2 + "HelloWorld"); //12HelloWorld
2) Scanner 获取用户键盘输入的数据
① 导包
import java.util.Scanner;
import 为关键字,用于导包;位置 :位于类定义的上方,package 的下方
② 创建 Scanner 对象
Scanner scanner = new Scanner(System.in);
③ 通过对象调用方法
scanner.nextInt() — 获取用户输入的 int 类型的整数
scanner.nextDouble() — 获取用户输入的 double 类型的数据
scanner.next() — 获取用户输入的字符串类型的数据
④ 关闭 Scanner
scanner.close();