前言
哈嘍大家好,這里是 Hello_Embed 的新一篇學習筆記。在前文中,我們學習了如何用結構體指針操作硬件寄存器,而寄存器的配置往往離不開位運算和條件判斷 —— 比如通過邏輯運算精準修改某幾位的值,通過關系運算判斷硬件狀態。這篇筆記將系統梳理關系運算和邏輯運算的規則,以及它們在嵌入式開發中的實用場景,為后續寄存器操作打下基礎。
🔍 關系運算:判斷條件的真假
關系運算的核心是 “比較兩個值的關系”,結果只有兩種:真(1)或假(0)。常見的關系運算符如圖所示
以<
與>
為例,我們通過代碼理解其邏輯:
先定義int a = 1
,比較a > 1
時,由于 1 并不大于 1,結果為假(0);比較a > 0
時,1 大于 0,結果為真(1)。
#include <stdio.h>
#include <string.h>
int mymain(void)
{int a = 1;int b,c;b = a > 1; // 條件不成立,b為0printf("b = %d\n\r", b);c = a > 0; // 條件成立,c為1printf("c = %d\n\r", c);return 0;
}
需要注意 “賦值” 與 “比較” 的區別:
a = 1
是賦值操作,將 1 賦給變量 a;a == 1
是比較操作,判斷 a 的值是否等于 1,結果為 0(假)或 1(真)。
我們通過一道題目測試理解:
int a = 2;
int b, c, d;
b = (a == 2); // a等于2,條件成立,b=1
c = (a != 2); // a不等于2?條件不成立,c=0
d = (a >= 2); // a大于等于2,條件成立,d=1
答案:b=1,c=0,d=1。關系運算的邏輯其實很直接:成立為真(1),不成立為假(0)。
?? 邏輯運算:位操作與條件組合
邏輯運算分為 “按位運算” 和 “邏輯組合運算”,在寄存器配置中高頻使用。
按位運算的規則與特性
常見的按位運算符如圖所示
結合之前指針筆記中的補充
我們詳細梳理其用法:
- 按位與(&):兩個位都為 1 時結果為 1,否則為 0。
特性:0 & 任何數 = 0
,1 & 任何數 = 任何數本身
。可用于 “清零特定位”。 - 按位或(|):兩個位中有一個為 1 時結果為 1,否則為 0。
特性:1 | 任何數 = 1
,0 | 任何數 = 任何數本身
。可用于 “置 1 特定位”。 - 按位異或(^):兩個位不同時結果為 1,相同時為 0。
例如:1 ^ 0 = 1
,1 ^ 1 = 0
,0 ^ 0 = 0
。可用于 “翻轉特定位”。 - 按位取反(~):0 變 1,1 變 0。常與按位與結合,用于生成 “位掩碼”。
- 左移(<<):將二進制數向左移動指定位數,等價于 “原數 × 2?”。
例如:5 << 1
(二進制0101 << 1
=1010
),結果為 10(即 5×21)。 - 右移(>>):將二進制數向右移動指定位數,等價于 “原數 ÷ 2?”(整數除法)。
例如:5 >> 1
(二進制0101 >> 1
=0010
),結果為 2(即 5÷21,取整數部分)。
邏輯與(&&)和邏輯或(||)
在按位與(&)和按位或(|)的基礎上,我們再學習用于條件組合的邏輯運算符:
- 邏輯與(&&):判斷兩個條件是否同時成立,兩個條件都為真(非 0)時結果為 1,否則為 0。
- 邏輯或(||):判斷兩個條件是否至少有一個成立,只要有一個條件為真(非 0),結果就為 1,否則為 0。
為了區分容易混淆的&=
與&&
,我們用表格對比:
運算符 | 名稱 | 功能 | 操作數類型 | 示例 |
---|---|---|---|---|
&= | 按位與賦值 | 逐位進行與運算并賦值 | 整數類型(如 int) | a &= 3 等價于 a = a & 3 |
&& | 邏輯與 | 判斷兩個條件是否同時成立 | 結果為 0 或非 0 | if (a > 0 && b < 10) |
總結
&=
是按位運算符,用于對整數的二進制位進行操作。&&
是邏輯運算符,用于組合多個條件表達式,返回布爾值0/1。
同理,|=
(按位或賦值)與||
(邏輯或)的區別可類比理解:|=
用于位操作,||
用于條件組合。
實戰檢驗
通過代碼測試邏輯運算的結果,思考c1、c2、c3、c4
的值:
a = 3;
b = 1;
c1 = (a > 4) && (b < 5); // 兩個條件是否同時成立?
c2 = (a > 4) || (b < 5); // 兩個條件是否至少一個成立?
c3 = !(a > 4) || !(b < 5); // 條件取反后是否至少一個成立?
c4 = !(a > 4) && !(b < 5); // 條件取反后是否同時成立?
答案揭曉:
c1 = 0
:a > 4
為假(0),b < 5
為真(1),兩個條件不同時成立;c2 = 1
:b < 5
為真,至少一個條件成立;c3 = 1
:!(a > 4)
為真(1),!(b < 5)
為假(0),至少一個為真;c4 = 0
:兩個取反后的條件不同時成立。
結尾
這篇筆記系統梳理了關系運算(判斷真假)和邏輯運算(位操作與條件組合)的規則,尤其是按位運算在寄存器配置中的實用技巧(清零、置 1、翻轉特定位),以及邏輯運算符在條件判斷中的應用。這些都是嵌入式開發中操作硬件的基礎,比如通過|=
置位寄存器的某一位來點亮 LED,通過&&
組合多個狀態條件來判斷系統是否正常。
下一篇,Hello_Embed 將跟著韋東山老師學習if語句。我們下篇見。