本文主要介紹c/c++程式設計中兩個巧用異或解決問題的方法。
一、巧用異或進行取反運算
假設安排乙個周健身計畫表,每天的可選專案包括:running,riding,swimming。現用乙個enum表示周一到週日,如下:
enum day;
上述enum用二進位製上的一位,表示這一天是否有安排。不同位可以疊加,能夠非常方便的表示不同天的狀態,還可以參與計算。比如,前個專案的安排如下:
long runningschedule = 0x25;
long ridingschedule = 0x12;
第乙個值表示它占用了周
一、週三和周四;第二個值表示它占用了周二和周五。這樣表示,具有互斥性。他們的和為:
long scheduledays = 0x37;
我現在要看有哪些天是空閒的,或者我要取消「runningschedule」。我們需要對
「runningschedule」取反,c++的按位取反運算子是「~」,但是,在實際的編碼中,我對該long型的值,執行取反運算「~runningschedule」,並未取得我想要的值,我使用的vs2015 ide,vc++編譯器。
那麼,有沒有別的辦法來代替直接的取反運算呢?
答案是,有!那就是用異或。
scheduledays &= runningschedule ^ 0xffff;
見上述表示式,即可取消
「runningschedule」。它最主要的原理是用異或,實現取反的功能。
二、異或互動兩個變數的值
在c語言面試中,經常會碰到這樣一道題:不定義臨時變數,互動兩個數的值。一般的解法如下:
void exchange(int * a, int * b)
這種解法主要是通過加減和賦值運算來實現。它的缺陷有兩個:
1)未考慮極限情況下的加法溢位問題;
2)僅適用於互動可以進行加減運算的變數的值;
而使用異或不但可以彌補這兩個缺陷,而且運算速度更快,如下:
void exchange(int * a, int * b)
注:這裡應用了乙個簡單的異或法則:乙個數異或另乙個數兩次,值不變。
事實上,在aes的加解密演算法中,也會用到異或的這個特性。
異或 在Java中的運用
1 異或簡介 異或 操作運算規則為相同的為0,不同的為1 2 異或操作進行數字交換 我們現在有兩個數a,b,我們可以通過異或操作對他們倆的數字進行交換 a a b b b a a a b 這樣,這兩個數字的值就進行了交換 我們舉個例子,比如a 97和b 33 97的二進位制為1100001 33的二...
異或運算在程式設計中的應用
1.只出現一次的數字 給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。說明 你的演算法應該具有線性時間複雜度。你可以不使用額外空間來實現嗎?示例 1 輸入 2,2,1 輸出 1 示例 2 輸入 4,1,2,1,2 輸出 4 題目 2.缺失數字 給...
按位或「 」在多選中的應用
假定有這樣乙個問題,請從下列選項中選擇個人愛好 多選 選項包括 1.爬山 2.3.看書 4.寫作 5.唱歌 6.打遊戲 7.上網 問題 如何使用1個整數來確定使用者所選的愛好?首先,按位或運算的結果是 1 1 1 1 0 1 0 1 1 0 0 0 我將上面七個選項分別賦予乙個2的倍數,把這個值暫且...