不用中间变量,交换a、b值

如果要交换a、b之间的值,一般的做法是:

tmp=a;a=b;b=tmp;这种方法不得不使用一个临时变量。

从网上学来一个方法,可以不用使用临时变量:

a^=b^=a^=b;

这样计算之后,就可以交换a、b值

证明:

首先:^ 是 位运算 的一种: 异或 运算

1^1=0;

0^0=0;

1^0=1;

0^1=1;

将a、b用二进制表示为:

a=An-1 An-2……A1 A0

b=Bn-1 Bn-2……B1 B0

由于a与b进行位运算,是各个bit位分别进行运算,互不影响,下面对某一个位值i上的运算进行分析;

设Ai和Bi是a、b二进制位上的数值,0或1。

四种情况:

当Ai=1;Bi=1;时:

Ai^=Bi;后:Ai=0;

Bi^=Ai;后:Bi=1;

Ai^=Bi;后:Ai=1;

当Ai=1;Bi=0;时:

Ai^=Bi;后:Ai=1;

Bi^=Ai;后:Bi=1;

Ai^=Bi;后:Ai=0;

当Ai=0;Bi=1;时:

Ai^=Bi;后:Ai=1;

Bi^=Ai;后:Bi=0;

Ai^=Bi;后:Ai=1;

当Ai=0;Bi=0;时:

Ai^=Bi;后:Ai=0;

Bi^=Ai;后:Bi=0;

Ai^=Bi;后:Ai=0;

也就是说,对于a、b的每个bit位上的值,进行三次异或赋值运算之后,都会被交换,那么a、b值也就交换了。

传统的tmp=a;a=b;b=tmp;方法也是进行三次赋值运算,但是异或(^)作为位运算,效率更高,而且避免了中间变量的使用。

但是位运算只能在整型数值之间进行,这是此方法的局限性。


 1 namespace ConsoleApplication1
2 {
3 class Program
4 {
5 static void Main(string[] args)
6 {
7 int a = 10;
8 int b = 20;
9 a ^= b;
10 b ^= a;
11 a ^= b;
12 Console.WriteLine("a={0}", a);
13 Console.WriteLine("b={0}", b);
14 Console.ReadKey();
15 }
16 }
17 }
18
19 /*Out:
20 a = 20
21 b = 10
*/

对于int型变量最简单的方式是:
int a,b;
a = b – a + (b = a) ;

不用中间变量,交换a、b值,布布扣,bubuko.com

时间: 2024-08-04 18:34:21

不用中间变量,交换a、b值的相关文章

网络误区:不用中间变量交换2个变量的value,最高效的是异或运算.

本文记录了不使用中间变量交换2个变量的value,很多的网络留言说是直接异或运算就可以了,而且效率很高,是真的吗? 关于这个问题,网络上面有很多的解释,3种方法,我这里给比较一下各自的优缺点,然后简单分析一下汇编代码,分析代码如下: #include <stdio.h> void swap1(int &a,int &b) { int temp = a; a = b; b = temp; } void swap2(int &a,int &b) { a += b;

不用中间变量交换A和B的值

public class SwapAB { public static void main(String[] args) { // 两种值交换的方式,用中间变量空间复杂度高于不用中间变量,但时间复杂度要低于不用中间变量. // 常规写两个值的交换 int a = 100; int b = 200; System.out.println("初始值 a=100 b=200"); // 中间变量 int c; // 复制给中间变量,临时存 c = a; // 把b的值赋给a. a = b;

不用中间变量交换a 和b的值

// 不用中间变量的写法 ,假如 a=13, b=8; a=a+b =21; //此时 a=21; b=8; b=a-b=13; //此时a=21; b=13; a=a-b=8; //相当于 a=21-13=8; // 第二种不用中间变量,换运算,效率比加法高点 a = a ^ b; b = a ^ b; a = a ^ b;

不用中间变量交换a和b的值?

a = 5 b = 6 a = a+b b = a-b a = a-b print(a,b) a = 5 b = 6 a = a^b b = b^a a = a^b print(a,b) a = 5 b = 6 a,b = b,a print(a,b) 输出 (6, 5) (6, 5) (6, 5) 原文地址:https://www.cnblogs.com/sea-stream/p/11192483.html

不用中间变量交换两个数 swap(a,b);

#include <iostream> using namespace std; int main () { int a = 3; int b = 5; cout<<"a="<<a<<",b="<<b<<endl; a = a+b; ///a=7 b = a-b; ///b=3; a = a-b; ///a=5 cout<<"a="<<a<<

不使用中间变量交换变量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,比如(

交换两个值,不用临时变量(C位运算)

通常我们交换两个值,都是用一个临时的变量temp,拿交换a,b的值为例,通常的做法是: temp = a; a = b; b = temp; 不过利用位运算,真的是方便很多: 假如 a = 3,b = 4.想将a和b的值互换,可以用一下赋值语句实现: a = a ^ b:        b = b ^ a:        a = a ^ b: 下面用竖式进行简单说明:(10进制化为二进制)            a = 011(^)    b = 100则    a = 111(a ^ b的结果

不使用中间变量交换两个数. 求平均数考虑溢出

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> //不使用中间变量交换两个数的值 void exchange_num(int *a, int *b) { ①* a =*a + *b;    //适用范围广 * b = *a -* b; * a =* a - *b; ②* a = (*a )*(*b); * b = (*a )/(*b); * a = (*a ) / (*b);//当两个数有

交换变量的值

方法一:借助第三方变量 1 #region 1 利用第三方变量 2 int a = 10; 3 int b = 20; 4 Console.WriteLine("交换前的值:a={0},b={1}", a, b); 5 Console.ReadKey(); 6 int temp = a; 7 a = b; 8 b = temp; 9 Console.WriteLine("交换后的值:a={0},b={1}", a, b); 10 Console.ReadKey();