上次课程我们学习了数学上的基本运算(+, -, *, /, %)。
本次课程我们将更深入的了解 Java 中常用的其他运算符;
此外,我们还需要学会站在巨人的肩膀上,调用现成的库实现我们的需求
获取:通过 https://github.com/Java-A-2019/lab2
,获取。
提交:将提交物放到自己 lab2 的文件夹中,将文件夹压缩,压缩文件名应为你的 学号_姓名
(如1630201002_毛浩楠
),提交至 FTP 站点(ftp://10.132.141.33
)本课程文件夹的 work_upload/lab2
文件夹下。
提交物:本次lab只需提交 lab2_3.java
截止时间:2019年10月7日 23:59:59
从 FTP 课程文件夹的 LAB/lab2
中下载 api.zip
,解压后打开 index.html
,即可开始查询 Java 中常用的一些 api。下面让我们开始尝试查一些数学相关的 api。
在 Java 中,一些基本的数学函数都在 java.lang.Math
这个类中,如:对数函数 log
、余弦函数 cos
、正弦函数 sin
、四舍五入 round
、平方根 sqrt
等等。
tips: 实际编程的过程中,我们肯定会遇到许多问题。善于查文档,用好
1. 在 `Github` 上获取 `lab2_1.java`
2. 在本地运行该程序,思考每个输出语句结束后 `x` 的值是多少
1. 在 `Github` 上获取 `lab2_2.java`
2. 在本地运行该程序,思考 `&&` 与 `||` 短路的含义
19sser 这个学期正在上一门有趣的高等数学课 : )
这天,小A正在做书上的一道习题,需要证明
小A很快完成了证明。而作为软件工程专业的一名学生,小A忽然想用实际运算验证一下这个算式。请你帮忙完成lab2_3.java
中未完成的部分。
- 你需要用到
Math
这个类中的pow
方法,快使用你查询 API 的技能看看pow
方法是怎么用的吧 - 这个问题中等式的右边是我们常见的数学常数 e,而
Math
类中已经定义了许多常量来表示这些常数,如 用Math.PI
可以表示圆周率,而Math.E
就是我们需要用到的常数e - 当程序运行结果显示
Congratulations! You have finished the equation verification.
时,即成功完成。 思考:
- 程序中n的值可能需要你们自行调整,请调整到合适的值
- 验证成功的条件
Math.abs(right - left) < 1e-2
是什么意思
注意: Bonus 不一定需要提交,也不一定需要浪费你现在宝贵的时间瞥它一眼。毕竟,未来你总会掌握的~
如果你已完成以上的三道难题,恭喜你,此刻的你已经达到了历届大佬当初的水平
或许你应该休息一下,整理代码,准备提交 lab2 了。
如果你已经看到这里并且觉得兴奋又津津有味,那么本助教认为你获得了深入理解计算机系统的资格。
因此,本助教贴心的留下这个 Bonus,帮助你尝试一窥计算机的本质。
学习计算机上的位运算符,它们功能强大又令人疑惑,但是它们是如此的可爱,以至于我们必须要掌握它们 ; )
它们是:
1. &
2. |
3. ^
4. ~
5. >>
6. <<
这次的 Bonus,我们先简单进行一次位运算的入门
位:二进制位,简称“位”。是二进制记数系统中表示小于 2 的整数的符号,一般用 1 或 0 表示,是具有相等概率的两种状态中的一种。二进制位的位数可表示一个机器字的字长,一个二进制位包含的信息量称为一比特(bit)。
例子:
int 占 4 个字节(byte)
1byte = 8bit
换算下来,一个 int 类型即占 32 bit
int i = 88;
这里的88为十进制,
转换为二进制为:1011000,
使用完整的32位表示即为:00000000 00000000 00000000 01011000
程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。比如,&
运算本来是一个逻辑运算符,但整数与整数之间也可以进行 &
运算。
举个例子,6 的二进制是 110
,11 的二进制是 1011
,那么 6 & 11
的结果就是 2,它是二进制对应位进行逻辑运算的结果(0 表示 false
,1 表示 true
,空位都当 0 处理)。
6: 0110
11: 1011
& ----
2: 0010
定义 A = 8 (1000), B = 8 (1001)
-
&
:按位与,如果相对应位都是 1,则结果为 1,否则为 0A & B = 8 (1000)
-
|
:按位或,如果相对应位都是 0,则结果为 0,否则为 1A | B = 9 (1001)
-
^
:按位异或,如果相对应位值相同,则结果为 0,否则为 1A ^ B = 1 (0001)
-
~
:按位取反,按位取反运算符翻转操作数的每一位,即 0 变成 1,1 变成 0~A = 7 (0111)
-
<<
: 左移,按位左移运算符。左操作数按位左移右操作数指定的位数A << 2 = 32 (10 0000)
-
>>
:右移,按位右移运算符。左操作数按位右移右操作数指定的位数A >> 2 = 2 (0010)
如果不使用位运算的方法,我们完全可以使用下面的方式解决:
public static boolean isOdd(int num) { // odd 奇数
return num % 2 != 0;
}
那么如何使用位运算实现呢?
请下载 lab2_bonus.java
并补充其中缺失的部分。
tips: 一个数是偶数那么最后一位一定是 0 如果一个数是奇数那么最后一位一定是 1