Java后端
·04-22 18:35Day 2(补4.21)
✅ 今天做了:继续复习
1.二/十进制换算
1bit储存一个0或1,1byte=8bit
十进制转二进制:除2取余直到结果为0,余数倒序排列,向前补0
二进制转十进制:按位加权求和,顺序从右往左,第一个位权是2⁰
——————————————————————————————————
2.底层运算原反补码
补码设计目的:二进制原码运算涉及正负符号位,需要消除符号位影响,整数的底层存储都是补码形式
规则:正数相同,负数取反再+1
个人简易不完全正确理解:举例5+(-5)
1字节可以存放256个不同整数(含正负),看成为由128个坐标组成的可循环周期(一个○),mod=2^8=256。
正数的补码与原码相同,补码为00000101,从0-127即128个不同整数,此时为正数周期
负数的补码,需要进入到负数周期,先从00000101走完正数周期的坐标点,即5→127(加法),
再反方向走到对应位置,即-128→-5(减法变加法),刚好走完256坐标点一个mod,即00000101+(11111111+1);
11111111(2)=255(10)<256,所以需要补1来表示一个完整周期,结果为11111011,5+(-5),两个坐标点重合,与00000101+11111011=00000000结果吻合。故,负数的补码过程就诞生了,原码变反码,即为+11111111,反码+1变补码,即为增加缺少的mod的溢出量1.
————————————————————————————————————————————————————————
3.运算符
运算符=算术运算符+赋值运算符+比较运算符+逻辑运算符+位运算符+三元运算符
①算术运算符:加减乘除→+、-、*、/ ; 取余→%;自增/减→a++(--)或++(--)a
**浮点数取余运算**
举例-10.5 % 3 = -1.5,a=-10.5,b=3,r=-1.5,a = b × n + r→r=a-(b × n )
底层运算公式:a = b × n + r→r=a-(b × n )
其中,n=a - (b × floor(a/b)),floor为向下取整,a/b = -10.5/3 = -3.5,向下取整为-4
所以,r = -10.5 - (3 × -4) = -10.5 + 12 = 1.5,遵循“浮点数取模余数符号和被除数一致”原则,输出为-1.5
注意点:
1.由于浮点数底层存储为近似值,故浮点数取余有可能会丢失精度,如0.1 % 0.03 ≠ 0.01
2.高精度场景使用BigDecimal.remainder()
3.任何取模运算(整数 / 浮点数)前,都要校验除数非 0,避免程序崩溃
**a++与++a的区别**
a++:先取值后运算→a = 2;b = a++;→a=2;b=2;→a=3;b=2;
++a:先运算后取值→a = 2;b = ++a;→a=3;→a=3;b=3;
②赋值运算符→=、+=、-=、*=、/=、%=
以+=举例,其他一样。byte a = 10,计算a+=5;
a+=b等同a = (a的数据类型)(a+b)
**a+=b与a=a+b的区别**
byte a = 10;a = a + 5;
报错:不兼容的类型(b+5自动转int,不能直接赋值给byte)
更改:a = (byte)(a + 5);手动强制转换
自动强制转换:a+=5;通过,输出15
原理:使用+=时jvm会自动对运算结果自动强制转换为a的数据类型
易错:first.+=与=+,前者是复合运算,后者是使用=赋值了一个(+a)的数据
sec.重点:使用+=自动强制转换导致的数据溢出且该错误jvm不会报错
修正:添加赋值范围校验 (long)num + 1 <= Byte.MAX_VALUE
third.错误地循环使用+=拼接字符串,String 是 “不可变对象”,s += i本质是s = new String(s + i),循环次数越多,性能越差
修正:循环拼接字符串用StringBuilder
③比较运算符:
想等于==、不等于!=、大于>、小于<、大于等于>=、小于等于<=、是否类对象 instanceof
④逻辑运算符:
a&b→当 a 和 b 同时为 true ,则结果为 true, 否则为 false;a&&b→当 a 和 b 同时为 true ,则结果为 true, 否则为 false
a|b→当 a 和 b ,有一个为 true ,则结果为 true,否则为 false;a||b→当 a 和 b ,有一个为 true ,则结果为 true,否则为 false
!a→取反,非,false>true,true>false;a^b→亦或,两者相同则为true,两者不同则为false
⑤位运算符:二进制运算
&→有 0 则 0,全 1 则 1→判断奇偶(&1)
| →有 1 则 1,全 0 则 0→权限控制
^→相同为 0,不同为 1→交换两个数(不用临时变量)
~→补码取反,结果需转原码→底层数值转换
<<→等价于 ×2ⁿ(无溢出时)→快速乘 2
>>→等价于 ÷2ⁿ(保留符号)→快速除 2
>>>→全部位右移 n 位,左边补 0,结果始终为正数→无符号数值处理
⑥三元运算符
(条件)?结果1:结果2
注意:条件必须是boolean,结果1/2必须类型兼容
⑦运算符优先级
口诀:括号第一,乘除加减;比较在后,逻辑跟;三元赋值,最后算;记不住就加括号
——————————————————————————————————————————————
4.输入输出
输入→// 步骤1:创建Scanner对象(关联控制台输入流System.in)
Scanner scanner = new Scanner(System.in);
// 场景1:读取整数
System.out.print("请输入你的年龄:");
int age = scanner.nextInt();
System.out.println("你的年龄是:" + age);
// 步骤2:关闭Scanner(释放系统资源)
scanner.close();
输出→System.out.print();打印不换行
→System.out.println();打印后自动换行
→System.out.printf();格式化输出
// 格式说明符:%d(整数)、%f(浮点数)、%s(字符串)、%.2f(保留2位小数)
String name = "小明";
int age = 18;
double score = 95.5;
System.out.printf("姓名:%s,年龄:%d,成绩:%.2f\n", name, age, score);
——————————————————————————————————————————
5.控制结构
概念:默认程序是从上到下依次执行代码,控制结构就是控制代码执行顺序的语句
控制结构=顺序控制+分支控制+循环控制+跳转控制
①分支控制:单分支if、双分支if-else、多分支if-else if(多个)-else,switch分支,嵌套分支
switch分支语句:
switch (表达式) {
case 常量值1:
// 表达式等于常量值1时执行
break; // 跳出switch(可选,不写会穿透)
case 常量值2:
// 表达式等于常量值2时执行
break;
default:
// 表达式不等于任何常量值时执行(可选)
break;
}
易错:漏写break导致的case穿透
②循环控制:
for循环--打印9*9乘法口诀表
while循环--猜数字
do-while循环--密码验证
for-each循环--集合遍历
多重循环
③跳转控制
break--跳出当前循环--break+outer标签实现跳出到指定循环
continue--跳出本次循环
return--跳出整个方法
——————————————————————
📚 今日总结:二/十进制换算、底层运算原反补码、运算符、输入输出、控制结构
2
1
分享
操作
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
