理解 C# 中的二進制 XOR 運算
二進位運算是程式設計中的重要部分,尤其是在低階優化和位元操作時。 其中一種運算是異或(XOR)運算子。 在本文中,我們將透過Tim Corey的影片來探索C#的二進位異或運算子,"十分鐘內快速了解異或運算子"。
Tim的影片對於異或運算子及其語法和實際應用進行了出色的分析。 在下文中,我們將分析他的解釋和例子,同時參考具體的時間戳以便於參考。
介紹XOR
Tim在影片一開始提到,這是他對C#二進位的理解系列的第九課。他建立場景説明在這一節中,他將教授如何運作異或(XOR)運算子,以及它在不同情況下的用途。
XOR運算子的語法和基本説明
Tim引入了兩個值,1和2,並將它們打印到控制台以供参考。 他移除了32位的表示方式,以保持集中於標準的8位二進位表示。
在0:31,他解釋說XOR在C#中由插入符號(^)表示。 他提醒觀眾:
- AND運算子(&)要求兩個位元都為1才能返回1。
- OR運算子(|)如果至少有一位元為1則返回1。
- XOR運算子(^)僅當其中一個位元為1且不全為1時才返回1。
Tim進一步説明每個位元比較的規則:
- 1 XOR 0 = 1
- 0 XOR 1 = 1
- 1 XOR 1 = 0
- 0 XOR 0 = 0
這意味著XOR充當了兩個值之間的差異檢測器。
在C#代碼中展示XOR
Tim通過定義一個包含兩個值的XOR結果的uint變數來進入實際示例:
// Define two sample values
uint val1 = 0b0001; // 1 in decimal
uint val2 = 0b0010; // 2 in decimal
// Perform XOR operation between val1 and val2
uint result = val1 ^ val2;
// Print the resultant binary value of XOR operation
Console.WriteLine(Convert.ToString(result, toBase: 2).PadLeft(8, '0'));
// Define two sample values
uint val1 = 0b0001; // 1 in decimal
uint val2 = 0b0010; // 2 in decimal
// Perform XOR operation between val1 and val2
uint result = val1 ^ val2;
// Print the resultant binary value of XOR operation
Console.WriteLine(Convert.ToString(result, toBase: 2).PadLeft(8, '0'));
然後他將結果打印到控制台並記錄輸出:
0000 0011
這一輸出顯示XOR僅保留了原始值中一個具有1的位置,而不是兩者。
使用XOR進行值比較
Tim現在展示XOR的一個實際用途:檢查兩個值是否相同。
在3:00,他修改了值,使val2完全相同:
// Initialize val1 and val2 to the same value
uint val1 = 0b10011001;
uint val2 = 0b10011001;
// Perform XOR operation to check for identical values
uint result = val1 ^ val2;
// Output will be zero if both values are identical
Console.WriteLine(Convert.ToString(result, toBase: 2).PadLeft(8, '0'));
// Initialize val1 and val2 to the same value
uint val1 = 0b10011001;
uint val2 = 0b10011001;
// Perform XOR operation to check for identical values
uint result = val1 ^ val2;
// Output will be zero if both values are identical
Console.WriteLine(Convert.ToString(result, toBase: 2).PadLeft(8, '0'));
當他執行XOR運算時,結果為:
0000 0000
Tim解釋說,XOR結果為0意味著這些值是相同的。 這使得XOR成為比較兩個數字是否相等的一種快速方法。
XOR用於識別差異
在4:00,Tim展示了val2略有不同的情況。 這次,XOR產生了非零結果,表示值之間存在差異。
這一方法在效能比較大二進位值時非常有用,因為XOR可以在一步中突出差異。
XOR用於無須臨時變數交換兩個變數
Tim展示了一個經典的程式設計技巧:在不使用臨時變數的情況下交換兩個數字。
在5:40,他挑戰觀眾進行交換val2而不聲明額外變數。 解決方案使用XOR三次:
// Original values
uint val1 = 0b0010; // 2 in decimal
uint val2 = 0b0100; // 4 in decimal
// Swap the values using XOR
val1 = val1 ^ val2;
val2 = val1 ^ val2;
val1 = val1 ^ val2;
// After swap: val1 = 4, val2 = 2
Console.WriteLine($"val1: {val1}, val2: {val2}");
// Original values
uint val1 = 0b0010; // 2 in decimal
uint val2 = 0b0100; // 4 in decimal
// Swap the values using XOR
val1 = val1 ^ val2;
val2 = val1 ^ val2;
val1 = val1 ^ val2;
// After swap: val1 = 4, val2 = 2
Console.WriteLine($"val1: {val1}, val2: {val2}");
他走過這個過程:
val1 ^ val2,這意味著它現在持有兩個值的混合。- 在再次與
val1值。 - 再次進行XOR,
val2值。
在7:30,Tim打印了交換後的值,並確認val2成功地交換了值。
理解XOR的二進位表示
為了鞏固理解,Tim運行了一個二進位版本的交換操作,展示每一個XOR步驟如何影響位元。 他指出每個位元僅在必要時翻轉,使得XOR成為一種高效的值交換方法。
結論
Tim總結通過強化核心重點:
- XOR返回1僅當只有一個位元為1。
- 它可以有效地用於比較值。
- 它幫助在不使用第三個變數的情況下交換兩個值,使其成為編程挑戰中的一個方便技巧。
他鼓勵觀眾嘗試使用XOR並將其應用於實際問題以建立更深的理解。
最終想法
Tim Corey的影片在C#中對XOR運算進行了出色而簡明的分析。 通過逐步示範例子,他展示了運算子的用處於比較、差異,甚至值交換。
如果您對二進位運算或位元技巧感興趣,這是一個必看影片可以加強您對C#二進位操作的理解。
