|
|
@@ -124,7 +124,7 @@ public class Demo01 {
|
|
|
| **赋值运算符** | ✅ 本次课程重点 |
|
|
|
| **比较运算符** | ✅ 本次课程重点 |
|
|
|
| **逻辑运算符** | ✅ 本次课程重点 |
|
|
|
-| 位运算符 | 后续课程讲解 |
|
|
|
+| **位运算符** | ✅ 本次课程重点 |
|
|
|
| 三目运算符 | 后续课程讲解 |
|
|
|
|
|
|
---
|
|
|
@@ -482,6 +482,196 @@ public class Demo05 {
|
|
|
}
|
|
|
```
|
|
|
|
|
|
+---
|
|
|
+
|
|
|
+### 6. 位运算符
|
|
|
+
|
|
|
+> 位运算符用来直接操作**整型**(`byte`/`short`/`int`/`long`/`char`)的二进制位,性能极高,在底层编程、权限控制、编码算法中使用较多。
|
|
|
+
|
|
|
+| 运算符 | 名称 | 示例 | 说明 |
|
|
|
+|--------|------|------|------|
|
|
|
+| `&` | 按位与 | `5 & 3` | 对应位同时为 `1` 时结果为 `1`,否则为 `0` |
|
|
|
+| `|` | 按位或 | `5 | 3` | 对应位同时为 `0` 时结果为 `0`,否则为 `1` |
|
|
|
+| `^` | 按位异或 | `5 ^ 3` | 对应位相同为 `0`,不同为 `1` |
|
|
|
+| `~` | 按位取反 | `~5` | 单目运算符,`0` 变 `1`,`1` 变 `0` |
|
|
|
+| `<<` | 按位左移 | `5 << 1` | 向左移动指定位数,空位补 `0`,相当于 **×2ⁿ** |
|
|
|
+| `>>` | 按位右移 | `5 >> 1` | 向右移动指定位数,空位补**符号位**,相当于 **÷2ⁿ**(向下取整) |
|
|
|
+| `>>>` | 无符号右移 | `5 >>> 1` | 向右移动指定位数,空位补 `0`,负数会得到大正数 |
|
|
|
+
|
|
|
+#### ① `&` 按位与
|
|
|
+
|
|
|
+符号左右两边的数的每个二进制位,如果同时为 `1`,则运算结果为 `1`,否则为 `0`,最后把二进制数转换为十进制数。
|
|
|
+
|
|
|
+```
|
|
|
+ 0101 ← 5
|
|
|
+& 0011 ← 3
|
|
|
+--------
|
|
|
+ 0001 → 1
|
|
|
+```
|
|
|
+
|
|
|
+```java
|
|
|
+System.out.println(5 & 3); // 1
|
|
|
+```
|
|
|
+
|
|
|
+#### ② `|` 按位或
|
|
|
+
|
|
|
+符号左右两边的数的每个二进制位,如果同时为 `0`,则运算结果为 `0`,否则为 `1`,最后把二进制数转换为十进制数。
|
|
|
+
|
|
|
+```
|
|
|
+ 0101 ← 5
|
|
|
+| 0011 ← 3
|
|
|
+--------
|
|
|
+ 0111 → 7
|
|
|
+```
|
|
|
+
|
|
|
+```java
|
|
|
+System.out.println(5 | 3); // 7
|
|
|
+```
|
|
|
+
|
|
|
+#### ③ `^` 按位异或
|
|
|
+
|
|
|
+符号左右两边的数的每个二进制位,如果相同则为 `0`,不同则为 `1`,最后把二进制数转换为十进制数。
|
|
|
+
|
|
|
+```
|
|
|
+ 0101 ← 5
|
|
|
+^ 0011 ← 3
|
|
|
+--------
|
|
|
+ 0110 → 6
|
|
|
+```
|
|
|
+
|
|
|
+```java
|
|
|
+System.out.println(5 ^ 3); // 6
|
|
|
+```
|
|
|
+
|
|
|
+#### ④ `~` 按位取反
|
|
|
+
|
|
|
+单目运算符,符号右边的数的二进制位,如果为 `0` 则运算结果为 `1`,如果为 `1` 则运算结果为 `0`。
|
|
|
+
|
|
|
+```
|
|
|
+~ 0101 ← 5
|
|
|
+--------
|
|
|
+ 1010 → -6
|
|
|
+```
|
|
|
+
|
|
|
+```java
|
|
|
+System.out.println(~5); // -6
|
|
|
+```
|
|
|
+
|
|
|
+> **注意**:`~5` 的结果是 `-6`,因为计算机使用**补码**表示负数。
|
|
|
+
|
|
|
+#### ⑤ `<<` 按位左移
|
|
|
+
|
|
|
+把符号左边的数的二进制位,向左移动符号右边指定的位数,空出来的位置补 `0`。
|
|
|
+
|
|
|
+```
|
|
|
+ 0101 ← 5
|
|
|
+<< 1
|
|
|
+--------
|
|
|
+ 1010 → 10(相当于 5 × 2¹ = 10)
|
|
|
+```
|
|
|
+
|
|
|
+```java
|
|
|
+System.out.println(5 << 3); // 40(相当于 5 × 2³ = 40)
|
|
|
+```
|
|
|
+
|
|
|
+> **左移规律**:左移 n 位相当于乘以 2ⁿ(在不溢出的前提下)。
|
|
|
+
|
|
|
+#### ⑥ `>>` 按位右移
|
|
|
+
|
|
|
+把符号左边的数的二进制位,向右移动符号右边指定的位数,空出来的位置补**符号位**的值。
|
|
|
+
|
|
|
+> 二进制最左侧为最高位(符号位):`0` 表示正数,`1` 表示负数。
|
|
|
+
|
|
|
+```
|
|
|
+ 0101 ← 5
|
|
|
+>> 1
|
|
|
+--------
|
|
|
+ 0010 → 2(相当于 5 ÷ 2¹ = 2,向下取整)
|
|
|
+```
|
|
|
+
|
|
|
+```java
|
|
|
+System.out.println(5 >> 3); // 0(相当于 5 ÷ 2³ = 0,向下取整)
|
|
|
+```
|
|
|
+
|
|
|
+> **右移规律**:右移 n 位相当于除以 2ⁿ(向下取整)。
|
|
|
+
|
|
|
+#### ⑦ `>>>` 无符号右移
|
|
|
+
|
|
|
+把符号左边的数的二进制位,向右移动符号右边指定的位数,空出来的位置补 `0`。对负数操作后会得到大正数。
|
|
|
+
|
|
|
+```
|
|
|
+ 1111 1011 ← -5(8位表示)
|
|
|
+>>> 1
|
|
|
+-----------
|
|
|
+ 0111 1101 → 正数
|
|
|
+```
|
|
|
+
|
|
|
+```java
|
|
|
+System.out.println(-5 >>> 1); // 2147483645(大正数)
|
|
|
+```
|
|
|
+
|
|
|
+**位运算总结:**
|
|
|
+
|
|
|
+| 运算 | 效果 | 规律 |
|
|
|
+|------|------|------|
|
|
|
+| 左移 `<<` | 高位丢失,低位补 0 | 相当于 **×2ⁿ** |
|
|
|
+| 右移 `>>` | 低位丢失,高位补符号位 | 相当于 **÷2ⁿ**(向下取整) |
|
|
|
+| 无符号右移 `>>>`| 低位丢失,高位补 0 | 负数会变为大正数 |
|
|
|
+
|
|
|
+**完整代码 —— Demo06.java**
|
|
|
+
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @author WanJl
|
|
|
+ * @version 1.0
|
|
|
+ * @title Demo06
|
|
|
+ * @description 位运算符
|
|
|
+ * @create 2026/7/14
|
|
|
+ */
|
|
|
+public class Demo06 {
|
|
|
+ /*
|
|
|
+ 位运算符是用来直接操作 整型(byte/short/int/long/char)的二进制位,
|
|
|
+ 性能极高,在底层编程、权限控制、编码算法中使用的比较多
|
|
|
+
|
|
|
+ & 按位与 5&3 0101 & 0011 = 0001
|
|
|
+ | 按位或 5|3 0101 | 0011 = 0111
|
|
|
+ ^ 按位异或 5^3 0101 ^ 0011 = 0110
|
|
|
+ ~ 按位取反 ~5 ~0101 = 1010
|
|
|
+ << 按位左移 5<<1 0101 << 1 = 1010
|
|
|
+ >> 按位右移 5>>1 0101 >> 1 = 0010
|
|
|
+ >>> 无符号右移 5>>>1 0101 >>> 1 = 0010
|
|
|
+ */
|
|
|
+ public static void main(String[] args) {
|
|
|
+ // 按位与 &:对应位同时为1则结果为1,否则为0
|
|
|
+ System.out.println(5 & 3); // 1
|
|
|
+
|
|
|
+ // 按位或 |:对应位同时为0则结果为0,否则为1
|
|
|
+ System.out.println(5 | 3); // 7
|
|
|
+
|
|
|
+ // 按位异或 ^:对应位相同为0,不同为1
|
|
|
+ System.out.println(5 ^ 3); // 6
|
|
|
+
|
|
|
+ // 按位取反 ~:单目,0变1,1变0
|
|
|
+ System.out.println(~5); // -6
|
|
|
+
|
|
|
+ // 按位左移 <<:向左移动,低位补0,相当于 ×2ⁿ
|
|
|
+ System.out.println(5 << 3); // 40(5 × 2³ = 40)
|
|
|
+
|
|
|
+ // 按位右移 >>:向右移动,高位补符号位,相当于 ÷2ⁿ(向下取整)
|
|
|
+ System.out.println(5 >> 3); // 0
|
|
|
+
|
|
|
+ // 无符号右移 >>>:向右移动,高位补0,负数变为大正数
|
|
|
+ System.out.println(-5 >>> 1); // 2147483645
|
|
|
+
|
|
|
+ /*
|
|
|
+ 左移:高位丢失,低位补0,相当于 ×2
|
|
|
+ 右移:低位丢失,高位补符号位,相当于 ÷2 并且向下取整
|
|
|
+ 无符号右移:低位丢失,高位补0,对负数会得到大正数
|
|
|
+ */
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
结合 if-else 分支结构与算术运算符,完成以下练习:
|
|
|
|
|
|
### 练习 1:判断奇偶数
|
|
|
@@ -543,6 +733,38 @@ if (h > 1) {
|
|
|
|
|
|
> **思路**:`小时 = 总分钟 / 60`(整除),`剩余分钟 = 总分钟 % 60`(取余)。
|
|
|
|
|
|
+### 练习 5:成绩等级判定
|
|
|
+
|
|
|
+定义一个成绩变量 `score`,使用 `if - else if - else` 结合逻辑运算符 `&&` 实现多级判断:
|
|
|
+
|
|
|
+| 分数范围 | 等级 |
|
|
|
+|---------|------|
|
|
|
+| 90 ≤ score ≤ 100 | 优秀 |
|
|
|
+| 80 ≤ score < 90 | 良好 |
|
|
|
+| 70 ≤ score < 80 | 中等 |
|
|
|
+| 60 ≤ score < 70 | 及格 |
|
|
|
+| 0 ≤ score < 60 | 不及格 |
|
|
|
+| 其他 | 分数错误 |
|
|
|
+
|
|
|
+```java
|
|
|
+double score = 85.3;
|
|
|
+if (score >= 90 && score <= 100) {
|
|
|
+ System.out.println("优秀");
|
|
|
+} else if (score >= 80 && score < 90) {
|
|
|
+ System.out.println("良好");
|
|
|
+} else if (score >= 70 && score < 80) {
|
|
|
+ System.out.println("中等");
|
|
|
+} else if (score >= 60 && score < 70) {
|
|
|
+ System.out.println("及格");
|
|
|
+} else if (score >= 0 && score < 60) {
|
|
|
+ System.out.println("不及格");
|
|
|
+} else {
|
|
|
+ System.out.println("成绩错误");
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+> **知识点**:综合运用 `if-else` 语句 + 比较运算符 + 逻辑运算符 `&&`。
|
|
|
+
|
|
|
---
|
|
|
|
|
|
## 四、完整代码汇总
|
|
|
@@ -711,7 +933,7 @@ public class Demo04 {
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-### Demo05.java — 逻辑运算符
|
|
|
+### Demo05.java — 逻辑运算符 + 成绩等级练习
|
|
|
|
|
|
```java
|
|
|
/**
|
|
|
@@ -765,6 +987,85 @@ public class Demo05 {
|
|
|
System.out.println(true ^ false); // true
|
|
|
System.out.println(false ^ true); // true
|
|
|
System.out.println(false ^ false); // false
|
|
|
+
|
|
|
+ /*
|
|
|
+ 课堂练习题:
|
|
|
+ 定义一个成绩变量 score,判断:
|
|
|
+ 如果score大于等于90并且小于等于100,就输出优秀
|
|
|
+ 如果score大于等于80并且小于90,就输出良好
|
|
|
+ 如果score大于等于70并且小于80,就输出中等
|
|
|
+ 如果score大于等于60并且小于70,就输出及格
|
|
|
+ 如果score大于等于0并且小于60,就输出不及格
|
|
|
+ 在此范围外的任何值,都输出 分数错误。
|
|
|
+ */
|
|
|
+ double score = 85.3;
|
|
|
+ if (score >= 90 && score <= 100) {
|
|
|
+ System.out.println("优秀");
|
|
|
+ } else if (score >= 80 && score < 90) {
|
|
|
+ System.out.println("良好");
|
|
|
+ } else if (score >= 70 && score < 80) {
|
|
|
+ System.out.println("中等");
|
|
|
+ } else if (score >= 60 && score < 70) {
|
|
|
+ System.out.println("及格");
|
|
|
+ } else if (score >= 0 && score < 60) {
|
|
|
+ System.out.println("不及格");
|
|
|
+ } else {
|
|
|
+ System.out.println("成绩错误");
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### Demo06.java — 位运算符
|
|
|
+
|
|
|
+```java
|
|
|
+/**
|
|
|
+ * @author WanJl
|
|
|
+ * @version 1.0
|
|
|
+ * @title Demo06
|
|
|
+ * @description 位运算符
|
|
|
+ * @create 2026/7/14
|
|
|
+ */
|
|
|
+public class Demo06 {
|
|
|
+ /*
|
|
|
+ 位运算符是用来直接操作 整型(byte/short/int/long/char)的二进制位,
|
|
|
+ 性能极高,在底层编程、权限控制、编码算法中使用的比较多
|
|
|
+
|
|
|
+ & 按位与 5&3 0101 & 0011 = 0001
|
|
|
+ | 按位或 5|3 0101 | 0011 = 0111
|
|
|
+ ^ 按位异或 5^3 0101 ^ 0011 = 0110
|
|
|
+ ~ 按位取反 ~5 ~0101 = 1010
|
|
|
+ << 按位左移 5<<1 0101 << 1 = 1010
|
|
|
+ >> 按位右移 5>>1 0101 >> 1 = 0010
|
|
|
+ >>> 无符号右移 5>>>1 0101 >>> 1 = 0010
|
|
|
+ */
|
|
|
+ public static void main(String[] args) {
|
|
|
+ // 按位与 &:对应位同时为1则结果为1,否则为0
|
|
|
+ System.out.println(5 & 3); // 1
|
|
|
+
|
|
|
+ // 按位或 |:对应位同时为0则结果为0,否则为1
|
|
|
+ System.out.println(5 | 3); // 7
|
|
|
+
|
|
|
+ // 按位异或 ^:对应位相同为0,不同为1
|
|
|
+ System.out.println(5 ^ 3); // 6
|
|
|
+
|
|
|
+ // 按位取反 ~:单目,0变1,1变0
|
|
|
+ System.out.println(~5); // -6
|
|
|
+
|
|
|
+ // 按位左移 <<:向左移动,低位补0,相当于 ×2ⁿ
|
|
|
+ System.out.println(5 << 3); // 40
|
|
|
+
|
|
|
+ // 按位右移 >>:向右移动,高位补符号位,相当于 ÷2ⁿ(向下取整)
|
|
|
+ System.out.println(5 >> 3); // 0
|
|
|
+
|
|
|
+ // 无符号右移 >>>:向右移动,高位补0,负数变为大正数
|
|
|
+ System.out.println(-5 >>> 1); // 2147483645
|
|
|
+
|
|
|
+ /*
|
|
|
+ 左移:高位丢失,低位补0,相当于 ×2
|
|
|
+ 右移:低位丢失,高位补符号位,相当于 ÷2 并且向下取整
|
|
|
+ 无符号右移:低位丢失,高位补0,对负数会得到大正数
|
|
|
+ */
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
@@ -793,6 +1094,11 @@ public class Demo05 {
|
|
|
18. **`|` vs `||`**:`|` 两边都要计算,`||` 左边为 `true` 时右边不执行(短路)
|
|
|
19. **`^` 异或**:两边相同为 `false`,不同为 `true`
|
|
|
20. **`!` 非**:单目运算符,取反操作
|
|
|
+21. **位运算符**:`&`(按位与)、`|`(按位或)、`^`(按位异或)、`~`(按位取反)、`<<`(左移)、`>>`(右移)、`>>>`(无符号右移)
|
|
|
+22. **左移 `<<`**:高位丢失,低位补 0,相当于 **×2ⁿ**
|
|
|
+23. **右移 `>>`**:低位丢失,高位补符号位,相当于 **÷2ⁿ**(向下取整)
|
|
|
+24. **无符号右移 `>>>`**:低位丢失,高位补 0,负数会变为大正数
|
|
|
+25. **成绩等级练习**:综合运用 `if-else if-else` + 比较运算符 + 逻辑运算符 `&&` 实现多范围判断
|
|
|
|
|
|
---
|
|
|
|
|
|
@@ -807,3 +1113,6 @@ public class Demo05 {
|
|
|
| **复合赋值运算符** | 如 `+=`、`-=` 等,自带隐式强制类型转换 |
|
|
|
| **短路特性** | `&&` 左边为 `false` 或 `||` 左边为 `true` 时,右边不再运算 |
|
|
|
| **浮点数精度** | 浮点数在计算机中采用 IEEE 754 标准存储,存在精度误差,避免直接用 `==` 比较 |
|
|
|
+| **补码** | 计算机使用补码表示负数,正数的补码 = 原码,负数的补码 = 原码取反 + 1 |
|
|
|
+| **按位与 `&` vs 逻辑与 `&`** | 按位与操作整型的二进制位,逻辑与操作布尔值 |
|
|
|
+| **位运算性能** | 位运算直接操作二进制位,比算术运算性能更高,常用于底层编程 |
|