Просмотр исходного кода

docs: 追加Demo06位运算符及Demo05成绩等级练习到课堂笔记

- Demo06.java 新增位运算符(&、|、^、~、<<、>>、>>>)
- Demo05.java 追加成绩等级判定练习(if-else + 逻辑运算符 &&)
- Demo02.java 注释更新:标记位运算符为已完成
- 更新 20260714-笔记.md 新增位运算符章节(含二进制图解和规律总结)
- 新增综合练习5:成绩等级判定
- 更新随堂练习要点和拓展阅读
WanJL 14 часов назад
Родитель
Сommit
87ec55f991

+ 1 - 1
授课代码/c260714/src/Demo02.java

@@ -18,7 +18,7 @@ public class Demo02 {
             2、赋值运算符 ✅
             3、比较运算符 ✅
             4、逻辑运算付 ✅
-            5、位运算符
+            5、位运算符
             6、三目运算符
 
      */

+ 30 - 0
授课代码/c260714/src/Demo05.java

@@ -49,5 +49,35 @@ public class Demo05 {
         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,就输出不及格
+                在此范围外的任何值,都输出 分数错误。
+            知识点:
+                if...else.语句
+                比较运算符
+                逻辑运算符
+         */
+        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("成绩错误");
+        }
+
+
     }
 }

+ 76 - 0
授课代码/c260714/src/Demo06.java

@@ -0,0 +1,76 @@
+/**
+ * @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,然后再把二进制数转换为十进制数
+        //比如 5 & 3
+        // 0101
+        // 0011
+        // 0001
+        System.out.println(5&3); //1
+        // 按位或 | 符号左右两边的数的每个二进制位,如果同时为0,则运算结果为0,否则为1,然后再把二进制数转换为十进制数
+        //比如 5 | 3
+        // 0101
+        // 0011
+        // 0111
+        System.out.println(5|3);    //7
+        // 按位异或 ^ 符号左右两边的数的每个二进制位,如果相同则为0,不同则为1,然后再把二进制数转换为十进制数
+        //比如 5 ^ 3
+        // 0101
+        // 0011
+        // 0110
+        System.out.println(5^3);    //6
+        // 按位取反 单目运算符,符号右边的数的二进制位,如果为0,则运算结果为1,如果为1,则运算结果为0
+        //比如 ~5
+        // 0101
+        // 1010
+        System.out.println(~5); //-6
+
+        //按位左移 << 把符号左边的数的二进制位,向左移动符号右边的个数,空出来的位置补0
+        // 5<<1
+        // 0101
+        // 1010     末位补0
+        System.out.println(5<<3);   //把符号左边的5的二进制数0101,向左移动符号右边个数 3,空出来的位置补0
+
+        // 按位右移 >> 把符号左边的数的二进制位,向有移动符号右边的个数,空出来的位置补【符号位】的值
+        // 二进制数的最左侧为最高位,也就是符号位,符号位如果是0,那么这个二进制数就是正数,如果是1,这个二进制数就是负数
+        //  8位2进制数  1010 1111   这就是负数
+        //  16位2进数   0000 0000 1010 1111  这就是正数
+        // 5>>1
+        // 0101
+        // 0010     右侧多出来的1,被截断。左侧空出来的补符号位 0
+
+        System.out.println(5>>3);   //6 把符号左边的5的二进制数0101,向右移动符号右边个数 3,空出来的位置补符号位
+
+        //无符号右移 >>> 把符号左边的数的二进制位,向有移动符号右边的个数,空出来的位置补0
+        // 8位 -5
+        // 1111 1011
+        // 0111 1101
+
+        System.out.println(-5>>>1); // 把符号左边的-5的二进制数1111 1011,向右移动符号右边个数 1,空出来的位置补0,从负数变为正数
+
+        /*
+            左移:高位丢失,低位补0,相当于 ×2
+            右移:低位丢失,高位补符号位,相当于 ÷2   并且向下取整
+            无符号右移:低位丢失,高位补0,对负数会得到大正数
+         */
+    }
+}

+ 311 - 2
课堂笔记/01-JavaSE基础-笔记/20260714-笔记.md

@@ -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 逻辑与 `&`** | 按位与操作整型的二进制位,逻辑与操作布尔值 |
+| **位运算性能** | 位运算直接操作二进制位,比算术运算性能更高,常用于底层编程 |