如果要交换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;方法也是进行三次赋值运算,但是异或(^)作为位运算,效率更高,而且避免了中间变量的使用。

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

 namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int a = ;
int b = ;
a ^= b;
b ^= a;
a ^= b;
Console.WriteLine("a={0}", a);
Console.WriteLine("b={0}", b);
Console.ReadKey();
}
}
}

/*Out:
a =
b = 10
*/

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

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

  1. java不用中间变量交换两个值

    public void changeVal(){ int a = 2; int b = 3; System.out.println("交换前 a:"+a+",b:&quo ...

  2. 不用中间变量交换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 ...

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

    本文记录了不使用中间变量交换2个变量的value,很多的网络留言说是直接异或运算就可以了,而且效率很高,是真的吗? 这里简单的说一下我的环境:Win7 32位,Qt creator 5.4.1 编译器 ...

  4. C语言位操作--不用中间变量交换两数值

    1.使用加法与减法交换两数值: #define SWAP(a, b) ((&(a) == &(b)) || \ (((a) -= (b)), ((b) += (a)), ((a) = ...

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

    a = b = a = a+b b = a-b a = a-b print(a,b) a = b = a = a^b b = b^a a = a^b print(a,b) a = b = a,b = ...

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

    #include <iostream> using namespace std; int main () { ; ; cout<<"a="<<a ...

  7. [转][C/C++] 怎样不用中间变量temp 实现两个数交换

    第一类方法也是常用的方法,通过多次的数值计算来完成交换,到现在知道的有下面三种: (1)加减法. a = a + b; b = a - b; a = a - b; 该方法可以交换整型和浮点型数值的变量 ...

  8. 通过位异或来交换a,b的值和通过中间变量交换a,b的值

    //通过位异或来交换a,b的值 #include <stdio.h> int main(int argc, const char * argv[]) {    int a=20,b=10; ...

  9. 在JS中 实现不用中间变量temp 实现两个变量值得交换

    1.使用加减法; var a=1; var b=2; a=a+b; b=a-b; a=a-b; 2.使用乘除法(乘除法更像是加减法向乘除运算的映射) var a=1; var b=2; a = a * ...

随机推荐

  1. Redis的认识和基本操作

    Redis是什么 Redis 是一个高性能的开源的.C语言写的Nosql(非关系型数据库),数据保存在内存中. Redis 是以key-value形式存储的Nosql,和传统的关系型数据库不一样.不一 ...

  2. Python中进程和线程的总体区别

    Num01–>线程 线程是操作系统中能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位. 一个线程指的是进程中一个单一顺序的控制流. 一个进程中可以并发多条线程,每条线程并行 ...

  3. Code Chef GEOCHEAT(凸包+旋转卡壳+随机化)

    题面 传送门 题解 以下记\(S_i=\{1,2,3,...,i\}\) 我们先用凸包+旋转卡壳求出直径的长度,并记直径的两个端点为\(i,j\)(如果有多条直径随机取两个端点) 因为这个序列被\(r ...

  4. getopt() getopt_long()函数手册[中文翻译]

    getopt()函数 getopt_long函数 函数原型(function prototype) #include <unistd.h> int getopt(int argc, cha ...

  5. 解决chrome无法启用印象笔记-剪藏功能

        新版Chrome浏览器安全的问题,导致从印象笔记官网下载的rxs(crx)文件无法直接通过drap&drop功能添加功能块.可以将rxs(crx)文件后缀名改成rar格式,然后解压,通 ...

  6. docker下 klee第一个测试

    被测试的简单函数源文件位于  /klee_src/examples/get_sign 目录下 该源代码分为三个部分 第一个部分为被测试的函数 int get_sign(int x) { if (x = ...

  7. python学习笔记02-编码

    ASCII码  255个  每一个占1个字节 8位 解决中文的问题:出现一张扩展表  支持中文的第一张表  gb2312  后来发展为GBK1.0 Gb18030 万国码:unicode 世界统一 存 ...

  8. 【STM32H7教程】第14章 STM32H7的电源,复位和时钟系统

    完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第14章       STM32H7的电源,复位和时钟系 ...

  9. Redis客户端使用

    http://wenku.baidu.com/view/6ccd650af12d2af90242e63d.html 一.下载jedis 代码 jedis 代码地址:https://github.com ...

  10. 简述ARP请求过程(同一子网和不同子网)

    1. 同一子网 主机A在准备构造链路层以太网帧头时,首先根据目的IP去查找ARP表,如果找到对应项,则直接得到目的MAC地址,如果没有查到才执行上面所说的ARP广播请求.这样做是为了最大限度地减少广播 ...