导航
目录
运算符分类
算术运算符
关系运算符
逻辑运算符
赋值运算符
三元运算符
运算符优先级
进制介绍
二进制转十进制
八进制转十进制
十六进制转十进制
十进制转二进制
十进制转八进制
十进制转十六进制
二进制转八进制
二进制转十六进制
八进制转二进制
十六进制转二进制
运算符分类
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。主要有以下几类:
- 算术运算符
- 赋值运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 三元运算符
算术运算符
| 运算符 | 运算 | 范例 | 结果 |
|---|---|---|---|
| + | 正号 | +7 | 7 |
| - | 负号 | b = 11; -b | -11 |
| + | 加 | 9 + 9 | 18 |
| - | 减 | 10 - 8 | 2 |
| * | 乘 | 7 * 8 | 56 |
| / | 除 | 9 / 9 | 1 |
| % | 取模(取余) | 11 % 9 | 2 |
| ++ ++ | 自增(前置):先运算后取值 自增(后置):先取值后运算 | 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 |
| + | 字符串相加 | "Java" + "hehe" | "Javahehe" |
比较特殊的就是底下的字符串相加,可试着运行以下代码体验一下:
public class Test{
public static void main(String[] args){
int n = 1992;
String str1 = n + "";//int型转String类型
String str2 = "Java" + "hehe";
System.out.println(str1);
System.out.println(str2);
System.out.println("Java" + "hehe");
}
}
输出结果:
细节说明:
- 对于除号"/",它的整数除和小数除是有区别的;整数之间做除法时,只保留整数部分而舍弃小数部分
- 当对一个数取余时,可以等价 a % b = a - a / b * b ,这是取模运算的本质。这里要留意Java中可以对浮点数取余,而C/C++只可操作整数
关系运算符
| 运算符 | 运算 | 范例 | 结果 |
|---|---|---|---|
| == | 相当于 | 8 == 7 | false |
| != | 不等于 | 8 != 7 | true |
| < | 小于 | 8 < 7 | false |
| > | 大于 | 8 > 7 | true |
| <= | 小于等于 | 8 <= 7 | false |
| >= | 大于等于 | 8 >= 7 | true |
| instanceof | 检查是否是类的对象 | "javahehe" instanceof String | true |
细节说明:
- 关系运算符的结果都是boolean类型,即true或false
- 关系运算符组成的表达式即关系表达式
- 注意“==”和“=”的区别
逻辑运算符
| a | b | a & b | a && b | a | b | a || b | !a | a ^ b |
|---|---|---|---|---|---|---|---|
| true | true | true | true | true | true | false | false |
| true | false | false | false | true | true | false | true |
| false | true | false | false | true | true | true | true |
| false | false | false | false | false | false | true | false |
细节说明:
- 逻辑运算符用于链接多个条件(多个关系表达式),最终结果也是一个boolean类型
- 短路与 && ,短路或 || ,取反 !
- 逻辑与 & ,逻辑或 | ,逻辑异或 ^
- 在开发中一般使用短路与、短路或,效率高
- a ^ b: 叫逻辑异或, 当 a 和 b 不同时, 则结果为 true, 否则为 false
| 名称 | 语法特点 |
|---|---|
| 短路与 && | 如果第一个条件为false,则第二个条件不会判断(执行),最终结果为false,效率高 |
| 逻辑与 & | 不管第一个条件是否为false,第二个条件都要判断(执行),效率低 |
| 短路或 || | 如果第一个条件为true,则第二个条件不会判断(执行),最终结果为true,效率高 |
| 逻辑或 | | 不管第一个条件是否为true,第二个条件都要判断(执行),效率低 |
赋值运算符
| 运算符 | 运算 | 范例 | 结果 |
|---|---|---|---|
| = | 赋值 | a = 7 | 7 |
| += | 加等 | a = 7;a += 7 | a = 14 |
| -= | 减等 | a = 7;a -= 7 | a = 0 |
| *= | 乘等 | a = 7;a *= 7 | a = 49 |
| /= | 除等 | a = 7;a /= 7 | a = 1 |
| %= | 模等 | a = 7;a %= 7 | a = 0 |
细节说明:
- a += 7等价于a = a +7,其他类推
- 除了=之外,其他赋值运算符均为单目运算符,即只有一个操作数
- 运算顺序是从左往右
三元运算符
条件表达式 ? 表达式1 : 表达式2;
运算规则:若条件表达式为true,运算后的结果是表达式1;若条件表达式为false,运算后的结果是表达式2
细节说明:
- 三元运算符的结果可以进行赋值或作函数返回值
- 三元运算符可以转换成if - else 语句
运算符优先级
| 运算方向 | 运算符 |
|---|---|
| . {} [] ; , | |
| R ——> L | ++ -- ~ ! |
| L ——> R | * / % |
| L ——> R | + - |
| L ——> R | << >> >>> 位移 |
| L ——> R | < > <= >= instanceof |
| L ——> R | == != |
| L ——> R | & |
| L ——> R | ^ |
| L ——> R | | |
| L ——> R | && |
| L ——> R | || |
| L ——> R | ? : |
| R ——> L | = *= /= %= |
| += -= <<= >>= | |
| >>>= &= ^= != |
进制介绍
对于整数,常有以下四种表示方式:
- 二进制:0、1,满2进1,以0b或者0B开头
- 八进制:0~7,满8进1,以数字0开头表示
- 十进制:0~9,满10进1
- 十六进制:0~9及A(10)~F(15),满16进1,以0x或者0X开头表示。A~F不区分大小写
二进制转十进制
规则:从最低位(最右边)开始,将每个位上的数提取出来,乘以2的(位数-1)次方,然后求和
实例:将0b1011转成十进制的数,0b1011 = 1 * 2^(1-1) + 1 * 2^(2-1) + 0 * 2^(3-1) + 1 * 2^(4-1) = 1 + 2 + 0 + 8 = 11
八进制转十进制
规则:从最低位(最右边)开始,将每个位上的数提取出来,乘以8的(位数-1)次方,然后求和
实例:将0234转成十进制的数,0234 = 4 * 8^0 + 3 * 8^1 + 2 * 8^2 = 4 + 24 + 128 = 156
十六进制转十进制
规则:从最低位(最右边)开始,将每个位上的数提取出来,乘以16的(位数-1)次方,然后求和
实例:将0x23A转成十进制的数,0x23A = 10 * 16^0 + 3 * 16^1 + 2 * 16^2 = 10 + 48 + 512 = 570
十进制转二进制
规则:将该十进制数不断除以2,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制。(一般使用短除法操作,容易看清楚数据)
十进制转八进制
规则:将该十进制数不断除以8,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制。(一般使用短除法操作,容易看清楚数据)
十进制转十六进制
规则:将该十进制数不断除以16,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制。(一般使用短除法操作,容易看清楚数据)
二进制转八进制
规则:从低位开始,将二进制数每三位一组,转换成对应的八进制数即可
实例:将0b11010101转成八进制数,0b11(3)010(2)101(5) => 0325
二进制转十六进制
规则:从低位开始,将二进制数每四位一组,转换成对应的十六进制数即可
实例:将0b11010101转成八进制数,0b1101(D)0101(5) => 0xD5
八进制转二进制
规则:将八进制数每1位,转换成对应的一个3位的二进制数即可
实例:将0237转换成二进制数,02(010)3(011)7(111) = 0b10011111
十六进制转二进制
规则:将十六进制数每1位,转换成对应的4位的一个二进制数即可
实例:将0x23B转换成二进制数,0x2(0010)3(0011)B(1011)
二进制在运算中的说明
原码、反码、补码(重点、难点)
- 二进制是逢2进位的进位制,0、1是基本算符
- 现代的电子计算机技术全部采用的是二进制,因为它只使用0、1两个数字符号,非常简单方便,易于电子方式的实现。计算机内部处理的信息,都是采用二进制数来表示的。二进制(Binary)数用0和1两个数字及其组合来表示任何数。进位规则是逢2进1,数字1在不同位上代表不同的值,按从右至左的次序,这个值以二倍递增
在Java中,对于有符号的而言:
位运算符
- 二进制的最高位是符号位:0表示正数,1表示负数(0正1负)
- 正数的原码、反码、补码都一样(三码合一)
- 负数的反码 = 它的原码符号位不变,其他位按位取反
- 0的反码、补码都是0
- Java没有无符号数,即Java中的数都是有符号的
- 在计算机运算的时候,都是以补码的方式来运算的
- 当我们看运算结果时,要看他的原码
| 运算符 | 运算规则 |
|---|---|
| &(按位与) | 两位全为1,结果为1,否则为0 |
| |(按位或) | 两位至少有一个为1,结果为1,否则为0 |
| ^(按位异或) | 相异为1,相同为0 |
| ~(按位取反) | 0 -> 1,1 -> 0 |
| >>(算术右移) | 低位溢出,符号位不变,并用符号位补溢出的高位 |
| <<(算术左移) | 符号位不变,低位补0 |
| >>>(逻辑右移、无符号右移) | 低位溢出,高位补0 |
注意:无 <<< 符号,位运算符的操作数均是二进制中的每一位数
学习记录:
- 本篇博客整理于2022.7.17~2022.7.20
- 作者:如何写出最优雅的代码
- 如有错误,敬请指正
- 壟关注一波不迷路!如果觉得写的不错,看完了别忘了点赞和收藏啊,感谢支持



