亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

XOR變量交換如何工作?

XOR變量交換如何工作?

XOR變量交換如何工作?有人可以向我解釋如何在沒有臨時變量的情況下對兩個變量進行XOR交換嗎?void xorSwap (int *x, int *y){     if (x != y) {         *x ^= *y;         *y ^= *x;         *x ^= *y;     }}我明白它做了什么,但有人可以告訴我它是如何工作的邏輯嗎?
查看完整描述

3 回答

?
躍然一笑

TA貢獻1826條經驗 獲得超6個贊


您可以通過替換來了解它的工作原理:


x1 = x0 xor y0

y2 = x1 xor y0

x2 = x1 xor y2

代,


x1 = x0 xor y0

y2 = (x0 xor y0) xor y0

x2 = (x0 xor y0) xor ((x0 xor y0) xor y0)

因為xor是完全關聯和可交換的:


y2 = x0 xor (y0 xor y0)

x2 = (x0 xor x0) xor (y0 xor y0) xor y0

因為x xor x == 0任何x,


y2 = x0 xor 0

x2 = 0 xor 0 xor y0

而且因為x xor 0 == x任何x,


y2 = x0

x2 = y0

交換完成了。


查看完整回答
反對 回復 2019-08-12
?
開滿天機

TA貢獻1786條經驗 獲得超13個贊

其他人已經解釋過,現在我想解釋為什么這是一個好主意,但現在不是。

回到我們擁有簡單的單周期或多周期CPU的那一天,使用這個技巧避免代價高昂的內存解除引用或將寄存器溢出到堆棧是更便宜的。但是,我們現在擁有帶有大量管道的CPU。P4的管道范圍從他們的管道中有20到31個(或左右)階段,讀取和寫入寄存器之間的任何依賴可能導致整個事情停滯。xor交換在A和B之間有一些非常重的依賴關系,它們實際上并不重要,但在實踐中會使管道停頓。停滯的管道會導致代碼路徑變慢,如果在內循環中進行此交換,則移動速度會非常慢。

在一般實踐中,當您使用temp變量進行交換時,編譯器可以確定您真正想要做什么,并且可以將其編譯為單個XCHG指令。使用xor swap使編譯器更難以猜測您的意圖,因此更不可能正確地優化它。更不用說代碼維護等


查看完整回答
反對 回復 2019-08-12
  • 3 回答
  • 0 關注
  • 571 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號