如果要交换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. SQL处理数据并发,解决ID自增

    1 创建MaxIdProcess表,由于存储ID的最大值 CREATE TABLE [dbo].[MaxIdProcess]( ,) NOT NULL, --自增ID ) NOT NULL, --存储 ...

  2. Unreal Open Day游记

    前几天去参加了Unreal Open Day,周四早上从北京出发,坐地铁跟徐导,呵呵,simon他们汇合后,打车去了北京南站.一路上有小雨,不禁让人多少有点担心堵车,好在一路顺利.由于还没有一台较牛的 ...

  3. Servlet实现session读写

    前言     一个女人让他的程序员丈夫去商店买东西:你去附近的商店买些面包,如果有鸡蛋的话,买6个回来,这个丈夫买了6个面包回来,他的妻子大吃一惊:你为什么买了6个面包?! 程序员丈夫回答:因为他们有 ...

  4. Graph-684. Redundant Connection

    In this problem, a tree is an undirected graph that is connected and has no cycles. The given input ...

  5. 图片后门恶意捆绑工具FackImageexploer

    本文作者:夜莺 今天向大家提个醒,最近有一款工具名叫FackImageexploer,该工具能够将恶意的.bat和.exe程序与图片绑定在一起,假若受害者点击了图片,就会反弹个shell给不法分子,如 ...

  6. echart 遇到的点

    1,图表随着外部container变化而变化: window.onresize = myChart.resize (拿着resize在api文档中搜就看到了)

  7. SSL学习笔记

    /************************************数据类型***************************************//* Number(数值型),Bool ...

  8. net.sf.json.JSONOBJECT.fromObject 与 com.alibaba.fastjson.JSONObject.parseObject

    文章待补充,先写写以下知识点好了. NULL值处理之 net.sf.json.JSONObject 和 com.alibaba.fastjson.JSONObject区别 JSON作为一个轻量级的文本 ...

  9. vue 学前班002(创建一个实例)

    创建一个Vue实例 我们之前说过,Vue是数据驱动视图的,只要model(模型层)的数据改变了,Vue就会帮我们改变视图上显示的内容,不用我们自己去动手写代码更新.那么,它是怎么做到的,我们的代码要怎 ...

  10. iOS开发总结--三方平台开发之分享

    1.前言 在公司参与了多个应用三方平台的开发,涉及微信.微博.QQ.Facebook.meetup等,总结一下一般的接入三方平台SDK方法. 2.接入三方SDK 任何应用要接入三方平台,都需要在该平台 ...