1. 程式人生 > 實用技巧 >異或運算的一些應用

異或運算的一些應用

定義

  異或是一個數學運算,用於邏輯運算。如果a、b兩個值不同,則異或結果為1,否則結果為0,在C語言中是一種強大的基本運算子,有很多巧妙的應用。

  例如, A = 14, B = 10;

  A = 14,二進位制則為1110,B = 10,二進位制為1010.

  對二進位制數進行異或運算 -> 1110^1010 = 0100,對應十進位制就為4。

  在二進位制數異或過程中,我們可以得知異或運算是一種半加運算。什麼意思呢?半加即不帶進位的加法運算。

  如上面1110^1010 = 0100,如果在加法中,如下

  

  我們從低位開始加起,首先第0位為0+0=0;第一位1+1=0,如果是加號運算子,則需要進位,但由於是異或運算(半加),故不用進位,第二位為1+0=1;最後一位為1+1=0。最終結果就是0100,這就是半加的過程。

異或運算的一些應用

1.異或最常用的一種用法 -- 交換兩個數的值。

  這裡直接上程式碼。

 1 /*************************************************************************
 2     > File Name: swap.c
 3     > Author: yudongqun
 4     > Mail: [email protected]
 5     > Created Time: Fri 16 Oct 2020 04:48:54 PM CST
 6  ***********************************************************************
*/ 7 8 #include <stdio.h> 9 10 int main(void) { 11 int a = 10, b = 20, tmp; 12 13 #if 0 14 /*用中間值來實現值交換*/ 15 tmp = a; 16 a = b; 17 b = tmp; 18 #else 19 /*用異或操作來實現值交換*/ 20 a ^= b; 21 b ^= a; 22 a ^= b; 23 #endif 24 printf("a: %d, b: %d\n", a, b); 25 26 return
0; 27 }
ydqun@VM-0-9-ubuntu operator % gcc swap.c                                                                  [0]
ydqun@VM-0-9-ubuntu operator % ./a.out                                                                     [0]
a: 20, b: 10
ydqun@VM-0-9-ubuntu operator % 

  

  

  這裡異或操作實現的值交換的好處是少使用了一個臨時變臉,執行效率也比較高。

2,尋找只出現一次的數字。

給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。

說明:

你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?

示例 1:

輸入: [2,2,1]
輸出: 1

示例 2:

輸入: [4,1,2,1,2]
輸出: 4

 1 /*************************************************************************
 2     > File Name: single_number.c
 3     > Author: yudongqun
 4     > Mail: [email protected]
 5     > Created Time: Fri 16 Oct 2020 05:20:25 PM CST
 6  ************************************************************************/
 7 
 8 #include <stdio.h>
 9 
10 int single_number(int nums[], int n) {
11     int res = 0;
12     for (int index = 0; index < n; index++) {
13     ┊   res ^= nums[index];
14     }
15     return res;
16 }
17 
18 int main(void) {
19     int nums[5] = {1, 2, 2, 1, 6};
20     printf("single number is : %d\n", single_number(nums, 5));
21 }
ydqun@VM-0-9-ubuntu operator % g++ single_number.c                                                         [0]
ydqun@VM-0-9-ubuntu operator % ./a.out                                                                     [0]
single number is : 6
ydqun@VM-0-9-ubuntu operator %