c++中的抑或運算


一、簡介

  • 符號:^
  • 邏輯關系:1^1=0  1^0=1  0^1=1  0^0=0     (即:當A、B不同時為1,相同時為0)
  • 運算法則:
  1. 交換律:a^b=b^a
  2. 結合律:a^b^c=a^(b^c)=(a^b)^c
  3. d=a^b^c  =>  a=d^b^c
  4. 自反性:a^b^a=b
  • 作用:
  1. 在交換兩個變量的值時,無需引入中間變量。可以利用抑或運算的自反性解決問題。
  2. 可以判斷一個二進制數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 }
codevs 3295

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM