异或交换变量

通常的交换两个变量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的值不能溢出。

时间: 2024-10-27 09:09:39

异或交换变量的相关文章

c#交换变量的几种方法(笔试之一)

大家很熟悉知道,交换变量经常的使用的一种方法是使用第三个变量,也符合正常人的思维逻辑,但是还有其他的一些方法来实现,但是有点“偏门”,记住就好了.下面就列举这几种方法. 第一种方法,会用到参数的方法再来修稿. 1 using System; 2 namespace Exercise 3 { 4 class Program 5 { 6 private static void Main(string[] args) 7 { 8 int num1 = 10; 9 int num2 = 5; 10 in

异或交换数值的分析

异或(^) 跟 按位与(&).按位或(|) 一样是一个位运算符,运算速度自然是很快的. 一般的,它似乎没什么用途.我所知道的它最多就用来加加密,用来交换数值.这里说说使用异或交换数值的一些利弊. 优点: 不需要使用中间变量 一般的交换a,b的值,是使用第三方变量temp temp = a; a = b; b = temp; 可是有一天突然发现了有异或交换数值的方法,这个方法不需要使用第三方变量 a = a ^ b; b = a ^ b; a = a ^ b;  这个方法的写法也很简单:复制3行a

1108: 零起点学算法15——交换变量

1108: 零起点学算法15--交换变量 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 3266  Accepted: 1706[Submit][Status][Web Board] Description 水题 Input 输入2个整数(题目包含多组测试数据) Output 输出交换后的2个整数(每组测试数据一行,中间用空格隔开) Sample Input 825 23 Sample Outpu

异或交换两个数;实现pow(int x, int y) ,即x的y次方

问题1:异或交换两个数 假设x=2:y=3,我们的目标是(没有蛀牙!!)交换x,y的值: 利用异或的特殊性:x^x=0 即两个相同数字异或后值为0: 解决: 令x=x^y=2^3 令y=x^y=x^y^y=2^3^3=2(此时x=x^y) 令x=x^y=x^y^2=2^3^2=3(此时x=x^y:y=2) 问题2:实现pow(int x, int y) ,即x的y次方 x的y次方就是有y个x连续乘机,代码如下: #include <stdio.h> #include <stdlib.h&

一种节省空间的交换变量的基本算法

一种节省空间的交换变量的基本算法,一个很简单的算法 因为其中没有引入temp变量,所以可以节省空间 代码如下: 一种节省空间的交换变量的基本算法

不适用临时空间,交换变量a和b

方法1: a = a + b; b = a - b; a = a - b; 方法2: a ^= b; b ^= a; a ^= b; 方法3: a = a * b; b = a / b; a = a / b; 不适用临时空间,交换变量a和b

不使用中间变量交换变量a、b的值的延伸

基础 为简单起见,用(x,y)表示变量a和b在某一时刻的一组值. 以交换a和b的值为例 (a,b)-->(a+b,b)-->(a+b,a)-->(b,a) 引申一 如果是改变三个变量的值呢?比如(a,b,c)-->(c,a,b)(向右循环移一位) (a,b,c)-->(a+b,b,c)-->(a+b,b+c,c)-->(a+b,b+c,a+b+c)-->(c,b+c,a+b+c)-->(c,a,a+b+c)-->(c,a,b) 自然想到n,比如(

不使用第三方变量交换变量遇到的思考

记一次在不使用第三方变量的情况下交换变量遇到的思考 今天百度了一下 在不使用第三方变量的情况下交换变量的几种方法 对其中的一种交换变量的方法特别感兴趣,看起来比较简单,但是琢磨了半天没有想明白他是按什么顺序去运行的 : 1 public static void main(String[] args) { 2 int a = 1000,b=2000; 3 4 a= b + ( b = a ) * 0; 5 6 System.out.println("a:" + a + " b:

3. 交换变量

题目: 输入两个整数 a 和 b, 交换二者的值,然后输出. 样例输入: 824 16 样例输出: 16 824 思路: 交换变量在C语言中用指针来实现,在C++中可以用引用来实现. 代码: #include <iostream>using namespace std; int main(){ int a = 0, b = 0; cin >> a >> b; swap(a, b); cout << a << " " <&