1. 程式人生 > >異或實現兩個數的交換

異或實現兩個數的交換

通常的交換兩個變數a,b的過程為
int temp;
temp=a
a=b;
b=temp;
需藉助上面的第3個臨時變數temp.


採用下面的方法,對於給定兩個整數a,b,下面的異或運算可以實現a,b的交換,而無需藉助第3個臨時變數:
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
這個交換兩個變數而無需藉助第3個臨時變數過程,其實現主要是基於異或運算的如下性質:
1.任意一個變數X與其自身進行異或運算,結果為0,即X^X=0
2.任意一個變數X與0進行異或運算,結果不變,即X^0=X
3.異或運算具有可結合性,即a^b^c=(a^b)^c=a^(b^c)
4.異或運算具有可交換性,即a^b=b^a


分析:
第一步:    a = a ^ b;
完成後 a變數的結果為a ^ b


第二步:    b = a ^ b;
此時賦值號右邊的a儲存的是a ^ b的值,那麼將賦值號右邊的a用a ^ b替換,
得到(a ^ b) ^ b=a ^ (b ^ b)=a ^0=a,
即經過第二步運算後b中的值為a,即b=a,將a換到了b裡


第三步:    a = a ^ b;
此時賦值號右邊的a儲存的仍然是a ^ b的值,不變,而賦值號右邊的b已經是a 了,
將賦值號右邊的a,b分別進行替換,
即此時賦值號右邊a ^ b=(a ^ b)^ a=a ^ b^ a=a ^ a^ b=0^ b=b, 該值賦值給a,即a=b
即經過第三步運算後a中的值為b,即a=b,將b換到了a裡
這樣經過如上的三步驟,完成了交換兩個變數a,b而無需藉助第3個臨時變數過程。
這個過程等價於如下的過程,:
a=a+b
b=a-b;
a=a-b;
前提是a+b的值不能溢位。
測試程式如下:
int main()
{
    int a = 4, b = 5;
    printf("a=%d b=%d\n", a, b);
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
    printf("a=%d b=%d\n", a, b);
}
執行結果:
[
[email protected]
cs]# ./a.out
a=4 b=5
a=5 b=4




異或 運算 還可以實現簡單的加密: 比如,  a==(a^b)^b, a是源資料,b是私鑰,

相關推薦

實現個數交換

通常的交換兩個變數a,b的過程為 int temp; temp=a a=b; b=temp; 需藉助上面的第3個臨時變數temp. 採用下面的方法,對於給定兩個整數a,b,下面的異或運算可以實現a,b的交換,而無需藉助第3個臨時變數:     a = a ^ b;    

^實現交換

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

進行個數交換的陷阱

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

使用運算實現交換

通常我們實現兩數交換不得不引入一個臨時變數temp作為媒介,而使用異或運算也能實現同樣的功能,甚至無需使用臨時變數。 這是一個通常的做法: int main(){ int a=1,b=2,temp; temp=a; a=b; b=temp; printf("%d,%d\n",a,b); ret

個數交換的3種方法(法有陷阱!)

最常用的方法,程式碼如下: int a=50,b=22,t; t=a; a=b; b=t;不使用額外空間的方法:(1)加減法 (2)異或法 (1)加減法程式碼如下: int a=50,b=22,t; a=a+b; b=a-b; a=a-b; (2)異或法(是兩數交換所用時間最快的方法) 顧名思義,就是將兩個數

如何在不介入第三個變量的情況下實現個數交換

16px bsp file 相同 rate cli 交換 ron eclips 如何在不介入第三個變量的情況下實現兩個數的交換: 1 package myeclipseFiles2; 2 3 public class Operator { 4 5 pu

寫一個巨集可以將一個數字的奇數位和偶數位交換。使用巨集實現個數中求較大值。

1. #include <stdio.h> #define SWAP(x) (((x&(0x55555555)) << 1) | ((x&(0xAAAAAAAA)) >> 1)) //0x55555555是十六進位制的1

使用函式實現個數交換

#include <stdio.h> void swap(int *a,int *b) { int tmp; tmp=*a; *a=*b; *b=tmp; } int main()

C語言實現個數交換

常常用C寫排序演算法時,經常寫兩個數的交換。想來,也把自己知到的這些方式記錄一下: (1)巨集定義方法: #define SWAP(a, b) {a = a + b; b = a - b; a = a - b;} 使用示例: int a[2] = {5, 1}; SW

c語言----交換a,b的值(分別用臨時變數,加減法,實現

1.藉助臨時變數 </pre><pre name="code" class="objc">#include <stdio.h> int main() { int a=0; int b=0; printf("please ent

c++實現個數交換

在c++中,有以下四種方法可以實現兩個數的交換: 1、指標傳遞 void swap1(int *p,int *q) { int temp=*p; *p=*q; *q=temp; } 2、巨集定義 #define swap2(x,

C語言:使用函式實現個數交換

此題的解決思路為:建立一個Swap函式,引數為a和b,函式內部建立一個臨時變數tmp,用於交換兩個數。 但需要注意的是:函式傳參的過程中需要注意,形參是實參的一份臨時拷貝,形參的改變不會影響實參,所以此時函式傳參的時候需要傳遞實參的地址(&a),即傳址呼叫,在接收部

我為什麼不喜歡用數值的交換

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

【C語言】編寫一個函式,實現個數交換 詳細解答

今天在用函式寫兩數交換的時候發現有點小挫折,然後經過多次查詢驗證才發現是因為地址不對的緣故,我在此放出兩種交換的方法,先發錯誤的如下:#include <stdio.h> void swap(int a,int b) { int temp=a; a

使用函式實現個數交換

#include<stdio.h> int swap(int *num1,int *num2) //異或方法交換 { *num1=*num1^*num2;

c語言:多種方法實現個數交換

交換兩個數的內容是c語言中常見的問題,所以在此總結一下我所學到的幾種方法。 首先,舉一個例子,假設a=10,b=20. 第一種方法,藉助一個臨時變數來進行儲存,這是最容易也是最直觀的方法。 程式碼如下: int a, b, t; a = 10;

多種方法實現個數交換

很多程式經常使用的最普通,比較常見的,也是比較簡單的一個演算法 1、普通方法,藉助一個額外記憶體變數實現交換: #include <iostream> using namespace std; int main(int argc, const char * argv[]) { i

C 使用函式實現個數交換

1.程式程式碼 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <Windows.h> int change_num(int *n1, int *n2)

數論——道水題。

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

C語言指標實現個數的互換

#include <stdio.h> void change1(int a, int b)//形參與實參不是同一個變數{ int t; t = a; a = b; b = t; } void change2(int * a, int * b)//只是把兩個變數的地址儲存的位置換了,但是變數的值