曦曦xixi
Java后端
·04-22 18:35
Day 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--跳出整个方法 —————————————————————— 📚 今日总结:二/十进制换算、底层运算原反补码、运算符、输入输出、控制结构
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP