數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)(一)——異或運(yùn)算的性質(zhì)與應(yīng)用

1. 異或的理解

我們通常把異或定義為不同為1,相同為0,即如如下真值表所顯示:

a b a ^ b
0 0 0
0 1 1
1 0 1
1 1 0

但從另外一方面想,我們可以將異或運(yùn)算認(rèn)為是二進(jìn)制的無進(jìn)位相加:

設(shè) a = 10110101

? b = 01011101

則 a ^ b = 11101000

相當(dāng)于每位各自相加但是沒有進(jìn)位。

2. 異或的運(yùn)算性質(zhì)

  1. 0 ^ N = N N ^ N = 0

  2. a ^ b = b ^ a (交換律) a ^ b ^ c = a ^ (b ^ c) (結(jié)合律)

  3. 同樣的一組數(shù)異或得到的數(shù)一定相同,因?yàn)椴徽撨@組數(shù)怎樣調(diào)換順序、組合,經(jīng)過2中的交換率和結(jié)合律都可以得到相同順序的一組數(shù)。

3. 異或的應(yīng)用

3.1 用于交換兩個數(shù)的變量值


int a = 甲;  //假設(shè)a的值為甲,b的值為乙

int b = 乙;

/*下面的程序用于交換兩個數(shù)的值*/

a = a ^ b;

b = a ^ b;

a = a ^ b;

就這樣,a和b的值就已經(jīng)進(jìn)行了交換,是不是有點(diǎn)不可思議!??

下面我們來具體分析一下三步運(yùn)算中a和b的值:

  • a = a ^ b; a = 甲 ^ 乙 b = 乙

  • b = a ^ b; a = 甲 ^ 乙 b = 乙 ^ 甲 ^ 乙 = 甲 ^ (乙 ^ 乙) = 甲

  • a = a ^ b; a = 甲 ^ 乙 ^ 甲 = (甲 ^ 甲) ^ 乙 = 乙 b = 甲

是不是清楚了很多呢?有沒有覺得這種方法很神奇???

但這種方法也有一定的限制??,使用時一定要注意這兩個變量是否指向一個內(nèi)存地址?。?!(應(yīng)用到數(shù)組中就是數(shù)組下標(biāo)是否相同),如果兩個變量指向一個內(nèi)存地址,那么異或操作會將變量的值置為0。

3.2 用于解決奇次數(shù)問題

  1. 一個數(shù)組中,一種數(shù)出現(xiàn)了奇數(shù)次,其他數(shù)出現(xiàn)了偶數(shù)次,如何找出這個出現(xiàn)奇數(shù)次的數(shù)?

分析:經(jīng)過上面的分析,很容易就想到了用異或的方法,因?yàn)橹挥幸粋€奇數(shù)次數(shù),其它都是偶數(shù)次數(shù),如果將數(shù)組中所有數(shù)進(jìn)行異或操作,那么最后剩下的那個數(shù)便是我們所求的奇數(shù)次數(shù)。

解決:定義一個初值為0的變量,分別與數(shù)組中的每個數(shù)異或,最后這個變量中保存的值就是所求的奇數(shù)次數(shù)。

  1. 一個數(shù)組中,兩種數(shù)出現(xiàn)奇數(shù)次,其他數(shù)出現(xiàn)偶數(shù)次,如何求出這兩個出現(xiàn)奇數(shù)次的數(shù)?

分析:??這下有兩個奇數(shù)次數(shù)了,該怎么辦呢?不慌,讓我們看看這組數(shù)異或后的結(jié)果是什么。

顯然,這組數(shù)異或最后就剩這兩個奇數(shù)次數(shù)了。設(shè)這兩個數(shù)分別為a和b。則異或的最后結(jié)果為a ^ b。因?yàn)槭莾煞N數(shù),所以a != b,則a ^ b != 0,即a和b至少有一個位上是不同的,a ^ b至少在某一位上為1,由a ^ b的結(jié)果可以求得這個位。將該數(shù)組分成兩種,一種是該位上為1的,另一種是該位上不為1的,則a和b分別位于兩種數(shù)組中。取一個eor',令其該位置為1其他位置為0,用eor'異或數(shù)組中所有該位上為1的數(shù),則最后結(jié)果一定為a或b。再將a或b與之前所求的a ^ b在進(jìn)行異或操作,就可以求出另外一個數(shù)。至此,a和b都已求出。

有沒有覺得異或運(yùn)算很神奇呢???

本人系菜鳥一枚,所寫文章皆為學(xué)習(xí)總結(jié),大佬請輕噴:??

謝謝閱讀:??,歡迎補(bǔ)充!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在C語言中,五種基本數(shù)據(jù)類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 3,993評論 0 2
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 12,306評論 6 13
  • 1、用C語言實(shí)現(xiàn)一個revert函數(shù),它的功能是將輸入的字符串在原串上倒序后返回。 2、用C語言實(shí)現(xiàn)函數(shù)void ...
    希崽家的小哲閱讀 6,674評論 0 12
  • 第一章數(shù)和數(shù)的運(yùn)算 一概念 (一)整數(shù) 1整數(shù)的意義 自然數(shù)和0都是整數(shù)。 2自然數(shù) 我們在數(shù)物體的時候,用來表示...
    meychang閱讀 2,833評論 0 5
  • 所思——杜甫 苦憶荊州醉司馬,謫官樽酒定常開。 九江日落醒何處,一柱觀頭眠幾回。 可憐懷抱向人盡,欲問平安無使來。...
    閑齋若比鄰閱讀 180評論 0 3

友情鏈接更多精彩內(nèi)容