1. 程式人生 > >我為什麼不喜歡用異或做兩數值的交換

我為什麼不喜歡用異或做兩數值的交換

大家在初學程式設計的過程中,肯定會學習到使用程式碼去交換兩元素的值

雖然已經過去了很久,但筆者對當時老師上課所講的話記憶猶新:

“交換兩個值,就像是把醋瓶子裡的酒裝入酒罐,把酒罐子裡的醋倒入醋瓶。

要完成此任務,就要多找一個空瓶子,作為兩者的交換的暫存罐”

同理,代入程式碼中,我們可以多定義一個變數,作為數值的“暫存罐”

int a = 5;
int b = 3;
int tmp;

tmp = a;
a = b;
b = tmp;

淺顯易懂,且十分符合我們作為初學者的正常思維邏輯

慢慢地,學到後來,筆者發現不少書籍以異或交換兩元素值為榮

(讓讀者不能直接看懂程式碼的內容以彰顯本書的高大上), ps: 這只是筆者的主觀想法。

而我們,也是無腦的跟著學,而十分簡單的交換運算自此也變得花裡胡哨起來:

a = a + b;
b = a - b;
a = a - b;
a = a ^ b;
b = a ^ b;
a = a ^ b;

......

在我當初的心中,假若別人第一眼無法看懂自己的程式碼,那麼就可以凸顯自己程式碼的高深莫測

僅僅在交換兩值上,就下了不少的功夫

我懂你們不懂的,我能寫出你們看不懂的

美其名曰為了面試拓展自己的程式碼風格,殊不知一大半都是自己的優越感與裝逼的慾望在作祟

舉個簡單的例子:

    對於吃飯,有的人用勺子吃,有的人用筷子吃,這本再正常不過。然後突然冒出來一個二逼,

用一支筷子,以一種離奇且不可描述的方式,也吃到了飯:你們這群low逼,看我用一支筷子就吃

到飯了,還節約使用了一支筷子......然後,原本正常吃飯的人也統統學習這個吃飯方式,生怕自己被落下

在此筆者不禁問一句:有意思嗎? 或者說,有意義嗎?

有沒有意思這個取決於個人,但意義,真的不大

使用勺子,使用一雙筷子,別人看到自然會想到這個人在吃飯

而倘若你用一支筷子,別人只會認為你瞎鬧著玩,更不會明白原來你在吃飯

代入程式設計中,這是程式碼的清晰度與否的問題

況且,用異或來交換兩元素的值,也未必就比使用暫存變數交換更快

我們總是理所當然得認為位運算會快一些,所以只要是有關位運算,我們總認為其效率高

更何況是交換兩值如此簡單的運算......

話不多說,直接上圖。為了具有一般性,筆者給運算加上了迴圈(代替了多次執行程式以求平均值),

這是筆者用自己的電腦多次執行程式之後,對結果取的適中的值:

  這是異或運算:

所以,無論是以程式碼的清晰度來書,還是程式執行的效率,我們都有理由選擇要一個“暫存罐”

使用異或交換兩元素值是眾多“用一支筷子的吃飯”的一例。希望大家在閱讀我的文之後,在面對著

那些炫耀著以一隻筷子吃飯的時候,能保持一個客觀清醒的態度並堅持使用自己的勺子(一對兒筷子),

畢竟,這都什麼年代了,又不是缺那一支筷子.......

(當然,假若你實在窮的沒有多餘的筷子了,不如將異或運算改為加減運算吧,因為如果兩數值相同的話,異或結果是為0的。我們再順帶把暫存罐也扔了)

a = a + b;
b = a - b;
a = a - b;

相關推薦

為什麼喜歡數值交換

大家在初學程式設計的過程中,肯定會學習到使用程式碼去交換兩元素的值雖然已經過去了很久,但筆者對當時老師上課所講的話記憶猶新:“交換兩個值,就像是把醋瓶子裡的酒裝入酒罐,把酒罐子裡的醋倒入醋瓶。要完成此任務,就要多找一個空瓶子,作為兩者的交換的暫存罐”同理,代入程式碼中,我們可

進行個數交換的陷阱

我們都知道可用通過異或運算交換兩個數,而不需要任何的中間變數。 如下面: void exchange(int &a, int &b) {     a ^= b;     b ^= a;     a ^= b; } 然而,這裡面卻存在著一個非常隱蔽的陷阱。通

操作實現的交換函數用以實現數組逆置中須要註意的問題

span include style 試題 blog text fontsize lib mod 用元素交換函數實現數組逆置非常easy,如以下代碼:(數組左右元素交換) #include<iostream> #include<stdlib.h>

^實現交換

轉載於:https://blog.csdn.net/zxm1306192988/article/details/50446399 原文:https://blog.csdn.net/u010141928/article/details/76140165  通常我們實現兩數交換不得不引

leetcode算法題1: 個二進制數有多少位相同?、位移、與運算的主場

output 判斷 ++ 輸入 urn ger ria 結果 ret /* The Hamming distance between two integers is the number of positions at which the corresponding bit

為什麼越來越喜歡@JsonView

自從使用springboot開發Java後臺以來,編碼正的簡化了很多,其中的一項福利便是可以通過內建的fastjson框架對restful介面返回的json資料進行屬性過濾——顧名思義,就是可以通過@JsonView註解針對不同的介面返回不同的json資料。但是為什麼我的標題卻說越來越不喜歡這個

PTA 個有序連結串列序列的交集 (很簡單 連結串列的)

 兩個有序連結串列序列的交集 (20 分) 已知兩個非降序連結串列序列S1與S2,設計函式構造出S1與S2的交集新連結串列S3。 輸入格式: 輸入分兩行,分別在每行給出由若干個正整數構成的非降序序列,用−1表示序列的結尾(−1不屬於這個序列)。數字用空格間隔。 輸出格式:

為什麼喜歡微信

微信在週五晚上進行更新,7.0.0來的轟轟烈烈。先是微博熱搜#微信更新#、張小龍的朋友圈、第二天則是熱搜#後悔更新微信嗎#引起又一輪討論。雖然不知道更新的資料怎麼樣,但我一看到訊息就進行更新、迫不及待地體驗新版微信。 開啟時,確實和QQ很像,音樂+圖片。圖片的配文“因你看見,所以存在”,則呼應張小龍朋友圈的

為什麽喜歡微信

精選 音視頻 -i 情況 浪漫 可見 比較 還需 新建 微信在周五晚上進行更新,7.0.0來的轟轟烈烈。先是微博熱搜#微信更新#、張小龍的朋友圈、第二天則是熱搜#後悔更新微信嗎#引起又一輪討論。雖然不知道更新的數據怎麽樣,但我一看到消息就進行更新、迫不及待地體驗新版微信。

喜歡程式碼,卻為何堅持程式設計師?

簡介一轉眼,距離自己成為一名碼農,已近一年了。回想當初,剛成為猿類時的那種對程式碼的激情,已經消失的差不多了。這個可能也跟我當初的想法有關,本身是數學科班出身,又接受了培訓,結果剛找工作時,誤打誤撞進入了售前的行業,寫程式碼就成了自己的未竟事件。我原本的職業規劃是:前端程式設

C語言的方法將個數的值互換

          在VC和GCC編譯器,a和b的值都互換了,但陣列array[0]和array[1]在gcc編譯器array[0]得到的是一個莫名其妙的0值,很令人費解。那麼原因是什麼呢?因為C++語言沒有在同一表示式中規定運算順序,對於同一變數的兩次修改不能放在一個表示式裡,所以在第二次更改同一變數時不能

交換個變數更耗時

FROM:陳碩 http://blog.csdn.net/solstice/article/details/5166912  翻轉一個字串,例如把 "12345" 變成 "54321",這是一個最簡單的不過的編碼任務,即便是 C 語言初學者的也能毫不費力地寫出類似如下的程式

個int變數交換值的一些方式(巧

兩個int變數交換值輸出,我們程式設計的時候一般都是引入第三個變數temp,這種方式大家都知道,但是筆試題的時候往往都會限制用第三個變數,這時候也簡單,大家的第一反應是不是都是 int x = 3; int y = 4; x = x + y; //x = 7 y =

運算交換個數

平常交換兩個數一般是利用一箇中間變數,其實可以利用異或^也可以實現交換,而且效率更快哦! 程式碼如下: void Swap(int& a,int& b){ if(a!=b){ a^=b; b^=a; a

交換個整數的陷阱

前面我們談到了,可用通過異或運算交換兩個數,而不需要任何的中間變數。 如下面: void exchange(int&a,int&b) {     a ^=b;     b ^=a;     a ^=b; } 然而,這裡面卻存在著一個非常隱蔽的陷阱。通常我們

交換個變數是錯誤的

用異或來交換變數是錯誤的 翻轉一個字串,例如把 “12345” 變成 “54321”,這是一個最簡單的不過的編碼任務,即便是 C 語言初學者的也能毫不費力地寫出類似如下的程式碼: // 版本一,用中間變數交換兩個數,好程式碼 void reverse_

代替按位求反

進制 code vc6.0 代碼 xor 想要 意思 6.0 div 按位取反,意思是原來的每一位,1變0,0變1。 按照這個1變0,0變1的標準,若求x的按位取反值,可以用求異或來替代。 異或的本質是模二加,效果是相同為1,相異為0。 對於x = 10101,想要用異或來

數論——道水題。

lld col tps include ons 區間 二進制 統計 但是 第一題:(沒有鏈接) 題目大意:給你n個數(n <= 1000000),第i個數用ai表示(每個a <= 1000000),求出每個數與其之後的數的xor和。 舉個例子吧,比如三個數1

來加密字串

這個沒什麼好寫的,就一個方法,放兩個引數,第一個是要加密的字串,後一個是異或的key,key只能為整數。 public String enOrDecrypt(String str , int key) { char[] mwChar = str.toCharArray(); for(in

1416: Find the Lost Sock(才AC)

1416: Find the Lost Sock Time Limit: 2 Sec Memory Limit: 128 MB [Submit][Status][Web Board] Description Alice bought a lot of pairs of socks y