不使用第三方变量交换两个数值变量的值(java语言)
2014-02-24 14:51
281 查看
面试时有时候会遇到的面试题,但其意义没多大!本文来源网络,整理由jast。
方法一、二 参考:此处
方法三 参考:此处
int a,b;
a=10;b=12;
a=b-a; //a=2;b=12
b=b-a; //a=2;b=10
a=b+a; //a=12;b=10
通过以上运算,a和b中的值就进行了交换。表面上看起来很简单,但是不容易想到,尤其是在习惯标准算法之后。
它的原理是:把a、b看做数轴上的点,围绕两点间的距离来进行计算。
具体过程:第一句“a=b-a”求出ab两点的距离,并且将其保存在a中;第二句“b=b-a”求出a到原点的距离(b到原点的距离与ab两点距离之差),并且将其保存在b中;第三句“a=b+a”求出b到原点的距离(a到原点距离与ab两点距离之和),并且将其保存在a中。完成交换。
此算法与标准算法相比,多了三个计算的过程,但是没有借助临时变量。(以下称为算术算法)
int a=10,b=12; //a=1010^b=1100;
a=a^b; //a=0110^b=1100;
b=a^b; //a=0110^b=1010;
a=a^b; //a=1100=12;b=1010;
此算法能够实现是由异或运算的特点决定的,通过异或运算能够使数据中的某些位翻转,其他位不变。这就意味着任意一个数与任意一个给定的值连续异或两次,值不变。
即:a^b^b=a。将a=a^b代入b=a^b则得b=a^b^b=a;同理可以得到a=b^a^a=b;轻松完成交换。
以上三个算法均实现了不借助其他变量来完成两个变量值的交换,相比较而言算术算法和位算法计算量相当,地址算法中计算较复杂,却可以很轻松的实现大类型(比如自定义的类或结构)的交换,而前两种只能进行整形数据的交换(理论上重载“^”运算符,也可以实现任意结构的交换)。
a=b+(b=a)*0;//代码一目了然
总结:
1、异或运算的特点:异或运算能够是数据中的某些位翻转,其他位不变---->任意一个数与任意一个给定的值连续异或两次,其值不变。
方法一、二 参考:此处
方法三 参考:此处
方法一、算术运算
简单来说,就是通过普通的+和-运算来实现。代码如下:int a,b;
a=10;b=12;
a=b-a; //a=2;b=12
b=b-a; //a=2;b=10
a=b+a; //a=12;b=10
通过以上运算,a和b中的值就进行了交换。表面上看起来很简单,但是不容易想到,尤其是在习惯标准算法之后。
它的原理是:把a、b看做数轴上的点,围绕两点间的距离来进行计算。
具体过程:第一句“a=b-a”求出ab两点的距离,并且将其保存在a中;第二句“b=b-a”求出a到原点的距离(b到原点的距离与ab两点距离之差),并且将其保存在b中;第三句“a=b+a”求出b到原点的距离(a到原点距离与ab两点距离之和),并且将其保存在a中。完成交换。
此算法与标准算法相比,多了三个计算的过程,但是没有借助临时变量。(以下称为算术算法)
方法二、位运算
通过异或运算也能实现变量的交换,这也许是最为神奇的,请看以下代码:int a=10,b=12; //a=1010^b=1100;
a=a^b; //a=0110^b=1100;
b=a^b; //a=0110^b=1010;
a=a^b; //a=1100=12;b=1010;
此算法能够实现是由异或运算的特点决定的,通过异或运算能够使数据中的某些位翻转,其他位不变。这就意味着任意一个数与任意一个给定的值连续异或两次,值不变。
即:a^b^b=a。将a=a^b代入b=a^b则得b=a^b^b=a;同理可以得到a=b^a^a=b;轻松完成交换。
以上三个算法均实现了不借助其他变量来完成两个变量值的交换,相比较而言算术算法和位算法计算量相当,地址算法中计算较复杂,却可以很轻松的实现大类型(比如自定义的类或结构)的交换,而前两种只能进行整形数据的交换(理论上重载“^”运算符,也可以实现任意结构的交换)。
方法三、运算符优先级
int a= 10,b=12;a=b+(b=a)*0;//代码一目了然
总结:
1、异或运算的特点:异或运算能够是数据中的某些位翻转,其他位不变---->任意一个数与任意一个给定的值连续异或两次,其值不变。
相关文章推荐
- 如何在不使用第三方变量的前提下,交换两个变量的值 (Java实现)
- 【Java】不使用第三方变量交换两个变量的值
- 【Java】不使用第三方变量交换两个变量的值
- C程序中交换两个变量数值,不使用第三方变量(四种方式)
- 【Java】不使用第三方变量交换两个变量的值
- JAVA不使用第三个变量,交换两个变量的值
- .NET第二章面试题:不使用第三方变量,交换两个变量的值
- 黑马程序员--不使用第三方变量交换两个变量的值
- JavaSE7基础 使用位运算异或 进行两个变量的数值交换
- 不使用第三方变量来交换两个变量的值
- Python3之不使用第三方变量,交换两个变量的值
- 在C# 中不使用 第三方变量 来交换两个变量的值
- Java--交换两个变量的值的三种方法:借助中间量交换,数值相加减交换,位移运算交换
- 如何不使用第三方变量交换两个变量的值
- 不借助第三方变量交换两个数值
- Java不使用第三个变量交换两个变量的数据
- 不使用第三方变量交换两个变量的值
- java语言学习之不使用变量交换两个数
- 【转】不使用第三方变量交换两个变量的值
- 不使用第三方变量交换两个变量的值