笔记来自2019求知讲堂零基础Java入门编程视频教程 https://www.bilibili.com/video/av76235341
算数运算符
运算符 | 运算 | 举例 | 运算结果 |
---|---|---|---|
+ | 正号 | a=3;+3 | 3 |
- | 负号 | a=4;-4 | -4 |
+ | 加 | 1+2 | 3 |
- | 减 | 4-1 | 3 |
* | 乘 | 2*3 | 6 |
/ | 除 | 13/5 | 2 |
% | 取模(取余) | 13%5 | 3 |
++ | 自增(前),先运算后取值 自增(后)先取值后运算 | a=2;b=++a; a=2;b=a++; | a=3;b=3; a=3;b=2; |
- - | 自减(前),先运算后取值 自减(后)先取值后运算 | a=2;b=- -a; a=2;b=a- -; | a=1;b=1; a=1;b=2; |
+ | 字符串连接 | “he”+“llo” | “hello” |
注:
1.整数间的二元运算规则:两个操作数有一个为long,结果则为long。只要没有long,结果均为int,即使操作数全是byte或short也一样。
int a = 3;
long b = 4;
int c = a + b; //报错
long c = a + b;//正确写法
byte b1 = 1;
byte b2 = 2;
byte b3 = b1 + b2; //报错
2.浮点数间的二元运算规则,两个操作数有一个为double,则结果为double;两个操作数均为float,结果才是float。
3.整数与整数做除法运算默认是取整的,如果需要精确的结果,不仅结果要用浮点型,其中一个数字也要做强制转换为浮点型,或者直接在整数后加.0
double a=13/5;//运算结果:2.0
double a=(double)13/5;//运算结果:2.6
double a=13.0/5;//运算结果:2.6
4.取模符号左侧是负数则结果是负数,取模符号右侧是负数结果依然是正数
System.out.println(13%-5);//运算结果:3
System.out.println(-13%5);//运算结果:-3
System.out.println(-13%-5);//运算结果:-3
5.取模运算的结果不一定总是整数
System.out.println(13.5%5);//运算结果:3.5
6.char类型和char类型(或其他数字类型)做 "+"运算,是转换为ASCII码计算的,和字符串进行 "+"运算时,是进行字符串连接
System.out.println('*'+'\t'+'*');//运算结果:93
System.out.println("*"+'\t'+'*');//运算结果:* *
赋值运算符
" = ":赋值运算符,当两侧数据类型不一致时,可以使用自动类型转换或强制类型转换原则进行处理。
- 支持连续赋值
int i0 = 1;
int i1 = 1;
int i2 = 1;
i0 = i1 = i2 = 2;
- 扩展赋值运算符
运算符 | ||
---|---|---|
+= | i += 2 | i = i + 2 |
-= | i -= 2 | i = i - 2 |
*= | i *= 2 | i = i * 2 |
/= | i /= 2 | i = i / 2 |
%= | i %= 2 | i = i % 2 |
注:
1.字符串可以使用"+=",实际上还是字符串拼接
String str="he";
str+="llo";
System.out.println(str);//运行结果:hello
2.使用扩展赋值运算符的好处在于会把运算结果强制转换为当前变量的类型
short s = 2;
s = s + 2;//cannot convert from int to short
s += 2;//正常运行,相当于s = (short)(s + 2);
比较运算符(关系运算符)
比较运算符的结果是Boolean类型的值,"==“不要误写成”="
运算符 | 运算 | 举例 | 运算结果 |
---|---|---|---|
== | 等于 | 4==5 | false |
!= | 不等于 | 4!=5 | true |
< | 小于 | 4<5 | true |
> | 大于 | 4>5 | false |
<= | 小于等于 | 5<=5 | true |
>= | 大于等于 | 4>=5 | false |
注:
- == 和 !=是所有数据类型都可以使用的(包括基本数据类型和引用数据类型),<、>、<=、>=仅针对数值类型(整型、浮点型、char)。
逻辑运算符
逻辑运算符是用于布尔值之间的计算,运算结果是布尔值
& | | | ! | ^ | && | || |
---|---|---|---|---|---|
逻辑与 | 逻辑或 | 逻辑非 | 逻辑异或 | 短路与 | 短路或 |
a,b都成立为true,否则都为false | a,b中至少有一个成立则为true | 取反 | a,b中一个成立 一个不成立 |
a | b | a&b | a|b | !a | a^b |
---|---|---|---|---|---|
true | true | true | true | false | false |
true | false | false | true | false | true |
false | true | false | true | true | true |
false | false | false | false | true | false |
注:
1."&""|“和”&&""||"的区别——短路
"&“和”|“在任何情况下都会对两侧的布尔表达式进行判断,但”&&“和”||“会先判断左边的表达式,如果可以得出结果则省略对右边的判断。具体来说,使用”&&“时先判断左侧,若为true则继续对右侧进行判断,若为false则直接判断结果为false;同理,使用”||"时若左侧为false则继续对右侧进行判断,若为true则直接判断结果为true。
int k=1;
int l=1;
System.out.println(1==2 && 2==++k);//运算结果false
System.out.println(1==2 & 2==++l);//运算结果false
System.out.println("k="+k);//运算结果k=1,可以看出&&右侧没参与运算
System.out.println("l="+l);//运算结果l=2
2.逻辑运算符用于连接布尔表达式,在Java中不可以写成3<x<6,而要写成x>3 && x<6。
3.异或(^)与或(|)的区别,异或追求的是"异",两侧要不同才为true。
位运算符
位运算符是直接对二进制进行运算
二进制
二进制是计算机技术中广泛采用的一种数制,用0和1来表示数字。类比于十进制的“逢十进一”,二进制的进位规则是“逢二进一”。
1.二进制转十进制
-
正整数
除二取余→倒序排列→高位补零
①以29为例,除二取余直到结果为0,获得的余数为10111
②然后将余数倒叙排列,得到29的二进制表示 11101
③由于Java中的数据都有固定位数,所以不足的位数以0补齐,假设需要8位,那么转换结果就是00011101 -
负整数
对应正整数转二进制→取反→加1
①以-29为例,29的二进制表示为00011101
②取反,为11100010
③加一,最终-29的二进制表示为 11100011 -
小数
小数部分乘二取整数部分→直到小数部分为0或位数足够→整数部分顺序排列
整数部分正常计算
连接整数部分和小数部分
①以 -29.125 为例
②整数部分29的二进制表示为11101
③小数部分按图中方式乘以二,取结果的整数部分顺序排列,得到0.001
④连接整数和小数部分,-29.125 的二进制表示为 11101.001
2.十进制转二进制
-
正整数
从右到左每一位分别乘以20、21、22……,然后相加
.
以11101(29)为例:
1×20+0×21+1×22+1×23+1×24=1+0+4+8+16=29 -
负整数
转换成对应正整数再计算 -
小数
从左到右每一位分别乘以20、2-1、2-2……,然后相加
.
以0.001为例
0×20+0×2-1+0×2-2+1×2-3=0+0+0+0.125=0.125
3.二进制的正负转换
正数二进制→反码(逐位取反)→补码(即加1)→负数二进制
负数二进制→减1→反码→正数二进制
位运算符
运算符 | 运算 | 举例 | 运算过程 |
---|---|---|---|
<< | 左移 | 3<<2=3*2*2=12 | m<<n=m*2n |
>> | 右移 | 3>>1=3/2=1 | m>>n=m*2-n |
>>> | 无符号右移 | 3>>>1=1 -3>>>1=214748364 | 见下方 |
& | 与运算 | 6&3=2 | 逐位与() (1&1=1,1&0=0,0&0=0) |
| | 或运算 | 6|3=7 | 逐位或 (1|1=1,1|0=1,0|0=0) |
^ | 异或运算 | 6^3=5 | 逐位异或 (1&1=0,1&0=1,0&0=0) |
~ | 反码 | ~6=-7 | 逐位取反 (~1=0,~0=1) |
1.左移:二进制序列整体向左移动相应位数,右面补零,左边超出部分删除
|0000 1100| →12
|00 001100|00 →12<<2 = 48
2.右移:二进制序列整体向右移动相应位数,正数左面补零,负数左面补1,右边超出部分删除
|00001100| →12
000|00001100 | →12>>3 = 1
|00001100| →12
|11110100| →-12
111|11110100 | →-12>>3 = -2
3.无符号右移:右移时不论正负,左侧都补0(正数的无符号右移结果和右移相同,负数的无符号右移结果是一个正数,因为计算机是通过二进制数字首位判断正负的,首位是1为负数,首位是0为正数)。
|0000 0000 0000 0000 0000 0000 0000 1100| →12
|1111 1111 1111 1111 1111 1111 1111 0100| →-12
000 |1111 1111 1111 1111 1111 1111 1111 0100 | →-12>>>3=536870910
4.与、或、异或、反码
(6)10 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | |
(3)10 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | |
6&3 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | (2)10 |
6|3 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | (7)10 |
6^3 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | (5)10 |
~6 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | (-7)10 |
三元运算符
(条件表达式)? 表达式1: 表达式2;
条件表达式为true:运算结果为表达式1;
条件表达式为false:运算结果为表达式2;
- 三元运算符可以嵌套使用
// 获取三个数中的较大数?
int i = 1;
int j = 9;
int k = 7;
int max = i > j ? (i > k ? i : k) : (j > k ? j : k);
运算符的优先级
优先级 | 运算符 | 结合性(同一等级优先级) |
---|---|---|
1 | () [] .(方法调用) | 从左到右 |
2 | ! +(正) -(负) ~ ++ - - | 从右到左 |
3 | * / % | 从左到右 |
4 | +(加) -(减) | 从左到右 |
5 | << >> >>> | 从左到右 |
6 | < <= > >= instanceof | 从左到右 |
7 | == != | 从左到右 |
8 | & | 从左到右 |
9 | ^ | 从左到右 |
10 | | | 从左到右 |
11 | && | 从左到右 |
12 | || | 从左到右 |
13 | ?: | 从右到左 |
14 | = += -= *= /= &= |= ^= ~= <<= >>= >>>= | 从右到左 |
注:
1.一般会使用()改变优先级以及提高程序可读性
2.注意& 、|、 ^的使用场景是位运算还是逻辑运算