不用中间变量,交换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;方法也是进行三次赋值运算,但是异或(^)作为位运算,效率更高,而且避免了中间变量的使用。
但是位运算只能在整型数值之间进行,这是此方法的局限性。
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值的更多相关文章
- java不用中间变量交换两个值
public void changeVal(){ int a = 2; int b = 3; System.out.println("交换前 a:"+a+",b:&quo ...
- 不用中间变量交换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 ...
- 网络误区:不用中间变量交换2个变量的value,最高效的是异或运算.
本文记录了不使用中间变量交换2个变量的value,很多的网络留言说是直接异或运算就可以了,而且效率很高,是真的吗? 这里简单的说一下我的环境:Win7 32位,Qt creator 5.4.1 编译器 ...
- C语言位操作--不用中间变量交换两数值
1.使用加法与减法交换两数值: #define SWAP(a, b) ((&(a) == &(b)) || \ (((a) -= (b)), ((b) += (a)), ((a) = ...
- 不用中间变量交换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 = ...
- 不用中间变量交换两个数 swap(a,b);
#include <iostream> using namespace std; int main () { ; ; cout<<"a="<<a ...
- [转][C/C++] 怎样不用中间变量temp 实现两个数交换
第一类方法也是常用的方法,通过多次的数值计算来完成交换,到现在知道的有下面三种: (1)加减法. a = a + b; b = a - b; a = a - b; 该方法可以交换整型和浮点型数值的变量 ...
- 通过位异或来交换a,b的值和通过中间变量交换a,b的值
//通过位异或来交换a,b的值 #include <stdio.h> int main(int argc, const char * argv[]) { int a=20,b=10; ...
- 在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 * ...
随机推荐
- Flask基础-基础实例
1. 10行代码的迷你程序 flask项目 from flask import Flask app = Flask(__name__) @app.route("/index") d ...
- Day 26封装
一.封装 广义上的封装: 属于一个类的静态和动态属性,总是出现在一个类中. 使用的永远用类名或者对象名调用. 狭义上的封装:就是把变量和方法私有化,在类的外部以及子类中不能直接使用了 . class ...
- uiautomator2
uiautomator2 该项目正在火热的开发中 uiautomator2 是一个可以使用Python对Android设备进行UI自动化的库.其底层基于Google uiautomator,Go ...
- git fetch and git pull &冲突
1.git fetch和git pull之间的区别 git fetch只会将本地库所关联的远程库的commit id更新至最新,fetch不会改变代码,如果想使代码更新,需要使用git merge o ...
- Python web后端接收到的json数据有前端格式的布尔值 true false
最近在后端处理前端传过来的json数据,发现,因为数据是各种数据格式的嵌套,使用json.loads(),无法将内层的数据转换为原来格式的数据,所以需要使用eval( )函数进行转换,但是如果数据含有 ...
- nodejs 像 C 语言那样输出当前代码的行数
http://stackoverflow.com/questions/11386492/accessing-line-number-in-v8-javascript-chrome-node-js Ob ...
- MySQL(视图、触发器、函数)
day61 参考:http://www.cnblogs.com/wupeiqi/articles/5713323.html 视图 视图:给某个查询语句设置别名,日后方便使用 ...
- mysql8安装成功后忘记密码
我安装的是社区免安装版,安装成功后密码忘记了.参考了网上的一些方法,自己也做下笔记.仅供参考. 我安装的mysql版本下载地址:https://dev.mysql.com/downloads/mysq ...
- D06——C语言基础学PYTHON
C语言基础学习PYTHON——基础学习D06 20180821内容纲要: 面向对象初级学习 1 面向对象 2 类 (1)封装 (2)继承 (3)多态 3 小结 4 练习:选课系统 5 课外拓展:答题系 ...
- YYYY-mm-dd HH:MM:SS 时间格式
YYYY-mm-dd HH:MM:SS部分解释 d 月中的某一天.一位数的日期没有前导零. dd 月中的某一天.一位数的日期有一个前导零. ...