異或運算的一些應用
阿新 • • 發佈:2020-10-16
定義
異或是一個數學運算,用於邏輯運算。如果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 return0; 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 %