異或實現兩個數的交換
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);
}
執行結果:
[
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)//只是把兩個變數的地址儲存的位置換了,但是變數的值