咱們一般把異或定義爲不一樣爲1,相同爲0,即如以下真值表所顯示:java
a | b | a ^ b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
但從另一方面想,咱們能夠將異或運算認爲是二進制的無進位相加:數組
設 a = 10110101學習
b = 01011101code
則 a ^ b = 11101000內存
至關於每位各自相加可是沒有進位。table
int a = 甲; //假設a的值爲甲,b的值爲乙 int b = 乙; /*下面的程序用於交換兩個數的值*/ a = a ^ b; b = a ^ b; a = a ^ b;
就這樣,a和b的值就已經進行了交換,是否是有點難以想象!😄class
下面咱們來具體分析一下三步運算中a和b的值:變量
a = a ^ b; //a = 甲 ^ 乙 b = 乙 b = a ^ b; //a = 甲 ^ 乙 b = 乙 ^ 甲 ^ 乙 = 甲 ^ (乙 ^ 乙) = 甲 a = a ^ b; //a = 甲 ^ 乙 ^ 甲 = (甲 ^ 甲) ^ 乙 = 乙 b = 甲
是否是清楚了不少呢?有沒有以爲這種方法很神奇?😁二進制
但這種方法也有必定的限制😢,==使用時必定要注意這兩個變量是否指向一個內存地址!!!==(應用到數組中就是數組下標是否相同),若是兩個變量指向一個內存地址,那麼異或操做會將變量的值置爲0。程序
- 一個數組中,一種數出現了奇數次,其餘數出現了偶數次,如何找出這個出現奇數次的數?
分析:通過上面的分析,很容易就想到了用異或的方法,由於只有一個奇數次數,其它都是偶數次數,若是將數組中全部數進行異或操做,那麼最後剩下的那個數即是咱們所求的奇數次數。
解決:定義一個初值爲0的變量,分別與數組中的每一個數異或,最後這個變量中保存的值就是所求的奇數次數。
- 一個數組中,兩種數出現奇數次,其餘數出現偶數次,如何求出這兩個出現奇數次的數?
分析:😶這下有兩個奇數次數了,該怎麼辦呢?不慌,讓咱們看看這組數異或後的結果是什麼。
顯然,這組數異或最後就剩這兩個奇數次數了。設這兩個數分別爲a和b。則異或的最後結果爲a ^ b。由於是兩種數,因此a != b,則a ^ b != 0,即a和b至少有一個位上是不一樣的,a ^ b至少在某一位上爲1,由a ^ b的結果能夠求得這個位。將該數組分紅兩種,一種是該位上爲1的,另外一種是該位上不爲1的,則a和b分別位於兩種數組中。取一個eor'
,令其該位置爲1其餘位置爲0,用eor'
異或數組中全部該位上爲1的數,則最後結果必定爲a或b。再將a或b與以前所求的a ^ b在進行異或操做,就能夠求出另一個數。至此,a和b都已求出。
有沒有以爲異或運算很神奇呢?😁
本人系菜鳥一枚,所寫文章皆爲學習總結,大佬請輕噴😱 謝謝閱讀😘,歡迎補充!