異或操作交換元素容易產生的問題

2021-06-01 12:24:28 字數 1004 閱讀 9784

利用異或操作交換兩個元素已不是什麼新鮮話題了。

1異或寫法:

2傳統寫法:

有很多程式設計師已經逐漸接受並喜歡使用這種異或寫法了,問之優點,大多數程式設計師都會從時間效能,空間效能,簡潔性三方面做回答。由於位操作較賦值操作的確快了些,空間上僅僅節約乙個單位,至於簡潔性就有點牽強了(明顯差不多嘛),可讀性反倒降低了,我覺得大多數程式設計師採用異或寫法有部分因素是因為覺得這種寫法比較酷。但為了這點酷,我們可能要在正確性等方面投入很多精力,付出更多的代價。

傳統的賦值寫法可適用於多種型別,其正確性也是毋庸置疑的。而異或寫法除了整型之外,不敢保證其疑惑操作符在作用與浮點或自定義型別時還能正確的工作。如果不想證明的話,那就老老實實使用傳統寫法吧。

在使用中交換操作往往被提取成swap函式,按照兩種寫法分別如下:

1.異或寫法

void swap(int* a, int* b)
2.傳統寫法

void swap(int* a, int* b)
實參呼叫往往是這樣swap(&num1, &num2);一般情況下兩種寫法都能正確工作。但是考慮如下情況:

int a = rand();

int* p1 = &a;

int* p2 = &a;

swap(p1, p2);

當兩個指標變數指向同乙個位址的資料時,只有傳統寫法可以工作。

究其原因傳統寫法把位址上的值取了出來,而異或寫法直接在原位址上進行值運算,一次異或之後值就成了0,兩個指標都指向這個位址,後面再怎麼異或也只能是0了。可以畫個圖來試試。

在應用中,如果要使用異或寫法來交換元素,就得確保所傳兩個位址不一樣,否則就會出現這話總錯誤。

為了一點酷,乙個單位空間的節省,極少的時間效能增益,可讀性降低了,正確性的風險更大了,操的心多了,試問,還有必要那麼寫嗎?

筆記一 2 1 8異或交換產生的問題

部落格一放,又是好久沒有寫了。前兩天買了兩本磚頭書回來。一本是 深入理解計算機系統 第二版的的中文版,另一本便是 演算法導論 第三版的中文版。打算花時間認認真真消化完這兩本書。再結合自己幾年的工作經驗,根據理論,做一些分析,力爭找到問題的本源,以及解決辦法,多寫幾句沒事,爭取把問題講透。另外一點,便...

交換的異或實現

如果想交換 a 和 b 的值,我們通常的做法是 宣告乙個臨時變數 temp,然後再實現互換,這種方式常見的讓我幾乎認為 就應該這樣做,但今日拜讀 深入理解計算機系統 一書時,卻發現了另一種巧妙的實現方式,不用第三個位置來臨時儲存,只需位操作 異或 即可。定義 a b a b ab a 為非a 1 1...

C C 使用異或交換元素及固有的缺點

如下 brief swap 異或交換兩元素 author version 1.0 date 2020 1 4 bug 不能指向同乙個記憶體位址 param in a 輸入a param in b 輸入a return void void swap int a,int b 下面來解釋這段 首先基於兩個...