一、簡介
- 符號:^
- 邏輯關系:1^1=0 1^0=1 0^1=1 0^0=0 (即:當A、B不同時為1,相同時為0)
- 運算法則:
- 交換律:a^b=b^a
- 結合律:a^b^c=a^(b^c)=(a^b)^c
- d=a^b^c => a=d^b^c
- 自反性:a^b^a=b
- 作用:
- 在交換兩個變量的值時,無需引入中間變量。可以利用抑或運算的自反性解決問題。
- 可以判斷一個二進制數a中為1的位數是奇還是偶:a=1010 => b=1^0^1^0=0 => 偶數個1
- 特別注意:抑或運算是在二進制的環境下進行的。如果輸入兩個十進制數,抑或運算會先轉換成二進制,再按位抑或。所以如果只看十進制的話,可能找不到什么規律。
二、例題
落單的數
題目描述 Description
有n個數(n是奇數),其中n-1個數兩兩成對,有1個數落單,找出這個數。要求O(n)的時間復雜度,O(1)的空間復雜度
輸入描述 Input Description
第一行輸入一個n, n是大於等於1的奇數
第二行包含n個整數
輸出描述 Output Description
輸出那個落單的數
樣例輸入 Sample Input
3
1 7 1
樣例輸出 Sample Output
7
數據范圍及提示 Data Size & Hint
1<=n<=4000001 n是一個奇數
單是這一道題的意義並不大,但是解題方法可以當做模板,以后有需要的直接用。

1 #include <iostream> 2 #include <cmath> 3 #include <cstring> 4 #include <cstdio> 5 #include <cstdlib> 6 #include <algorithm> 7 using namespace std; 8 9 int main() 10 { 11 int n,ans=0; 12 scanf("%d",&n); 13 for(int i=1;i<=n;i++) 14 { 15 int x; 16 scanf("%d",&x); 17 ans=ans^x; 18 } 19 printf("%d",ans); 20 //system("pause"); 21 return 0; 22 }