运算符
① 概念:用于变量(常量)运算的符号
② 运算符分类:
a. 算术运算符
b. 赋值运算符
c. 比较运算符
d. 逻辑运算符
e. 位运算符(进制的转换,原码、反码、补码)
f. 三元运算符
算术运算符
符号 | 名称 | 运算规则 | 备注 |
+ | 加 | 加法运算,字符串拼接,表示整数 | 如果符号的两边任意一边是字符串就是在拼接,拼接后的结果任然是一个字符串 |
- | 减 | 减法运算,表示负数 | |
* | 乘 | 乘法运算 | |
/ | 除 | 除法运算 | |
% | 取余 | 取余数 | 余数的正负只与被除数有关;判断某个数的奇偶;取某个整数的各个位数上的数字;判断是否被整除 |
++ | 自增 | 在原有的基础上自增1 | 符号可以在变量的前面也可以在变量的后面 |
- - | 自减 | 在原有的基础上自减1 | 符号可以在变量的前面也可以在变量的后面 |
自增自减符号位置不同时区别
① 符号可以卸载变量的两边: a++、++a、a--、--a
② 如果自增、自减作为一个独立的表达式,符号的位置在前和在后对于结果没有影响;都在实现自增或者自减
③ 如果在自增或者自减的过程中有参与了其他的运算,这个时候就需要看符号的位置
④ 符号在变量前面的时候,需要先进行自增或者自减再参与运算
⑤ 符号在变量的后面,需要先将值拿出来运算,运算完成后再进行自增或者自减
代码演示
public class Demo {
public static void main(String[] args) {
int i = 8;
int j = 2;
int x = (i++)*(++i)+(--j)*(i--)-(i++)*(--j)-(++i)*(++j);
System.out.println(x); // 79
System.out.println(i); // 11
System.out.println(j); // 1
}
}
赋值运算符
符号 名称 运算规则 = 赋值 将符号右边的数据赋值给左边的变量 += 加,再赋值 先进行左边两边数据加法运算,再将运算的结果赋值给符号左边的变量 -= 减,再赋值 先进行左边两边数据减法运算,再将运算的结果赋值给符号左边的变量 *= 乘,再赋值 先进行左边两边数据乘法运算,再将运算的结果赋值给符号左边的变量 /= 除,再赋值 先进行左边两边数据除法运算,再将运算的结果赋值给符号左边的变量 %= 取余,再赋值 先进行左边两边数据取余运算,再将运算的结果赋值给符号左边的变量
比较运算符
符号 | 名称 | 运算规则 |
== | 等于 | 判断符号两边的数据是否相等;如果符号两边都是基本数据类型,比较的是数据值;如果是引用数据类型,比较的是数据的地址 |
!= | 不等于 | |
>,>= | 大于,大于等于 | 只能用于能够自动转换成数字的类型进行比较,比较的是数值的大小 |
<,<= | 小于,小于等于 | 只能用于能够自动转换成数字的类型进行比较,比较的是数值的大小 |
逻辑运算符
符号 | 名称 | 运算规则 | 备注 |
&, && | 逻辑与 | 全真为真,否则为假 | &&具有短路的效果,一旦遇到条件结果为false,会直接返回结果为false,后面的条件不在计算 |
|, || | 逻辑或 | 全假为假,否则为真 | ||具有短路的效果,一旦遇到条件结果为true,会直接返回结果为true,后面的条件不在计算 |
! | 逻辑非 | 取反 |
代码演示
public static void main(String[] args) {
int a = 5,b = 6;
if(a > 6 && b++ > 7){
System.out.println("OK");
}
System.out.println(b);//6
}
public static void main(String[] args) {
int a = 5,b = 6;
if(a > 6 & b++ > 7){
System.out.println("OK");
}
System.out.println(b);//7
}
三元运算符
① 符号:? :
② 格式: 表达式1 ? 表达式2 :表达式3
③ 运算流程:
先计算表达式1,计算结果要么是true,要么是false
如果表达式1结果为true,就选择计算表达式2,并且将表达式2的结果作为三元运算最终的结果
如果表达式1结果为false,就选择计算表达式3,并且将表达式3的结果作为三元运算最终的结果
④ 注意:
表达式1,必须是 boolean 表达式;通常使用比较运算符来实现
表达式2、表达式3,没有要求类型,但是它俩必须是同一个类型
三元运算的结果需要处理,处理方式:一是直接打印(结果不需要二次使用),而是存储到新的变量中(结果可能被反复使用)
⑤ 案例:比较2个整数的大小,输出较小值;
a. 定义2个整数型变量,值任意给
int a = 10,b = 20;
b. 比较2个数的大小,使用三元运算符来选择比较的结果
a > b ? b : a; c.
直接输出三元运算的结果,或者将结果存到一个新的变量中,再打印变量
// sout( a > b ? b : a )
int min = a > b ? b : a;
sout(min);
进制
常见进制
① 生活中常见的进制:逢XX重新开始计算 十进制 七进制 六十进制 24进制
② 计算机中常见进制
十进制:逢十进1;0,1,2,3,4,5,6,7,8,9,10,11,····19,20······
二进制:逢二进1;0,1,10,11,100,101,······
八进制:逢八进1;0,1,2,3,4,5,6,7,10,11,12,13,14,15,16,17,20········
十六进制:十六进1:0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,10,11········
十进制与其他进制之间的转换
① 公式:除基倒取余 基:目标进制
② 案例:将十进制的数88,分别以八位的二进制、八进制、十六进制表示
二进制:以88作为被除数,循环除以2,一直除到商为0时,将所有余数倒着写出来;0101 1000
八进制:以88作为被除数,循环除以8,一直除到商为0时,将所有余数倒着写出来:130
十六进制:以88作为被除数,循环除以16,一直除到商为0时,将所有余数倒着写出来:58
③ 注意: 当十进制转换为16进制时,10 - 15 之间的数字需要用 a -- f 字母来表示
④ 练习: 将十进制 99 分别以八位的二进制、八进制、十六进制表示出来
二进制:0110 0011
八进制:143
十六进制:63
其他进制转换为十进制
① 公式:系数乘以基数的权次幂,再求和
系数:当前进制数上的每一位上的数字
基数:当前进制数 权:当前进制数,从右到左,从0开始计数
② 案例:二进制 0100 1001 ,八进制 56 ,十六进制 6d,用十进制数表示出来
0100 1001:1*2^6 + 1*2^3 + 1*2^0 = 73
56:5*8^1 + 6*8^0 = 40 + 6 = 46
6d:6*16^1 + 13*16^0 = 96 + 13 = 109
③ 练习:二进制 0110 1101 ,八进制 76 ,十六进制 dd,用十进制数表示出来
0110 1101 ---> 109
76 ---> 62
dd ---> 221
二进制转其他进制(其他进制转二进制刚好是逆过程)
① 二进制转十进制(系数乘以基数的权次幂,再求和)
② 二进制转八进制
规则:将二进制从右往左,3个为一组,计算出数值;不够为时用0补位
案例:0100 1001 --> 001 001 001 --> 111
③ 二进制转十六进制
规则:将二进制从右往左,4个为一组,计算出数值;不够为时用0补位
案例:0100 1111 --> 0100 1111 --> 4f
原码、反码、补码
① 计算机中关于数据的存储和运算使用的都是二进制的补码,原码和反码不是真实存在的,这两个只是为了方便编程人员计算负数的补码臆想出来的;数据有正有负,为了区分,就将二进制的最高位规定位符号位,如果最高位是1则表示负数,最高位为0表示正数。
② 正数的原码、反码、补码都是一样的(除基倒取余的方式)
③ 一个负数(默认用8为二进制表示)
传统的方式:
原码:取负数绝对值,再使用除基倒取余的方式算出原码,不够为时最高位补1,其余位补0
反码:原码取反,符号位(最高位不变),其余为1变0,0变成1
补码:反码 + 0000 0001
快速的方式:
牢记 -1 的补码为 1111 1111,负数的补码就在此基础上减去负数的(绝对值-1)
④ 案例:用八位二进制表示十进制数 120(-120) 的原码、反码、补码
二进制补码的运算
① 二进制补码运算时,不要做减法,通通用加法
② 例如:实现计算机底层 30 - 50 的过程;
如果使用减法运算:0001 1110 - 0011 0010 会发现不够减,没法借位
使用加法运算: 0001 1110 + 1100 1110 = 1110 1100
位运算
符号 | 名称 | 运算规则 |
>> | 右移 | 每移动一位,数值变成原来的1/2;正数最小到0,负数最大到-1 |
<< | 左移 | 每移动一位,数值变成原来的2倍;不能超出当前数据的范围 |
>>> | 无符号右移 | 跟右移一致;不能用来操作负数 |
& | 按位与 | 全真为真,否则为假;1为真,0为假 |
| | 按位或 | 全假为假,否则为真;1为真,0为假 |
^ | 按位异或 | 相同为假,不同为真;1为真,0为假 |
键盘录入
① 在程序的执行过程中动态的添加数据,让程序更加灵活,让数据的来源更加灵活
② 键盘录入的步骤
a. 导包:在类的声明上面,使用关键字 import java.util.Scanner
b. 创建键盘录入的对象:Scanner sc = new Scanner(System.in);
c. 来点提示:sout("请输入数据:");
d. 接受录入的数据:根据录入数据的类型选择合适的方法来获取数据 整型:int i = sc.nextInt(); 浮点数:double d = sc.nextDouble(); 字符串:String string = sc.next();
e. 对于录入数据的处理
案例:随机录入两个正整数,比较大小,将较大的数据控制台打印
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个数据:");
int i = sc.nextInt();
System.out.println("请输入第二个数据:");
int i1 = sc.nextInt();
int max = i > i1 ? i : i1;
System.out.println(max);
}
}