不用中间变量,交换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 * ...
随机推荐
- sqlserver插入之字符串+数字
declare @i int,@a varchar(10)set @i = 0set @a='hiro--'+LTRIM(@i)while @i < 500begin insert into h ...
- python小数的进位与舍去
一.基础知识准备 奇进偶舍,又称为四舍六入五成双规则.银行进位法(Banker's Rounding),是一种计数保留法,是一种数值修约规则.从统计学的角度,"奇进偶舍"比&q ...
- A - Subsequence (算法 二分 )
点击打开链接 A sequence of N positive integers (10 < N < 100 000), each of them less than or equal 1 ...
- Xshell多版本被曝存在后门,了解紧急响应修复预案
近日,Xshell远程终端工具被爆出多个版本存在后门,无疑是安全圈的一个大新闻.恶意攻击者利用该后门可以收集到用户名密码等主机敏感信息,并将之传回攻击者的机器,导致服务器信息泄露,进一步可致使整个服务 ...
- CSS3盒子模型(中)
在CSS盒子模型(上)讲到了盒子模型的边框,内外边距,外边距合并等知识,接下来要总结的是盒子模型的布局常用到的一些CSS属性,比如:float.position等知识. 盒子模型布局稳定性 开始学习盒 ...
- 解决 ArchLinux 下中文 Chinese 不能输入 couldnt input 的问题
解决 ArchLinux 下中文 Chinese 不能输入 couldnt input 的问题 一.Question 一年多的 ArchLinux 用户再次回归.然鹅,见面礼就是终端不能输入中文. 在 ...
- 把本地git仓库的项目上传到远程仓库
之前在学校实验室服务器上建了一个git远程仓库,存放我写的express项目代码.后来由于出去实习,就无法访问那个远程仓库了,因为它在校园网内. 还好我的笔记本中有这个项目完整的本地仓库,于是我就试着 ...
- 【转】Session 过期问题处理
原文:http://www.cnblogs.com/powerfan/archive/2011/03/29/1998691.html 在Asp.net应用中,很多人会遇到Session过期设置有冲突. ...
- php 实现繁体转简体代码效率对比
第一份代码: <?php Header("Content-Type:text/html;charset=utf-8"); function microtime_float() ...
- 《Mysql技术内幕,Innodb存储引擎》——索引与算法
B+树 B+树中,所有记录节点都按照键值的大小顺序放在同一层叶子节点,各个叶子节点指针进行连接. 图中指针是单向的,但是书上的图是双向的,而且旋转应该也是双向才能完成) B+树插入处理 Leaf Pa ...