java进行两数java交换值时,如何不用中间量就java交换值?

【震惊】异或交换两个数竟然没有直接中间变量赋值交换效率高!【java吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:635,773贴子:
【震惊】异或交换两个数竟然没有直接中间变量赋值交换效率高!收藏
long start = System.currentTimeMillis();
int a=100,b=200,t;
for(int i=0;i&=;i++){
for(int i=0;i&=;i++){//
long end = System.currentTimeMillis();
System.out.println(end-start);
java-亚马逊819店庆,一站购全球,全品类齐放价,钜惠就在眼前!亚马逊819店庆,正品低价,送货上门,货到付款!
循环10亿次,异或交换大概1000多毫秒直接中间变量赋值大概800毫秒我再也不用异或交换两个数数值了。。。以前搞ACM谁告诉我异或交换两个数效率高的
这个呢?i = j + (j = i) *0;
java不是不追求效率么
还有为什么C语言竟然运行了3000多毫秒?而异或运行了7000多毫秒……JAVA只运行了不到一秒C语言代码#include &stdio.h&#include &stdlib.h&#include &time.h&int main(){ clock_t start, start=clock(); int a=100,b=200;for(i=0;i&=;i++){
finish=clock(); printf("运行时间是%f\n",difftime(finish,start));//表示的是毫秒即千分之一秒 return 0;}
深入理解计算机系统第二章应该有提到这个
虽不明,但觉厉
To LZ从CPU来说,单纯XOR指令的效率当然是比MOV指令高的至于这样交换会慢的原因在于 你这两种代码需要的指令数差异 异或方式交换需要的指令远多于直接赋值
我是来秀CPU的
任何企图效率超过C语言的结果都会是错觉...
如果用组合语言,假定变数在eax及ebx上1:xchg
eax, ebx xor
ebx, eax xor
eax, ebx3:mov ecx, eaxmov eax, ebxmov ebx, ecx要不要3种试试?= =
那长度高的数组交换呢?
登录百度帐号推荐应用网络误区:不用中间变量交换2个变量的value,最高效的是异或运算.
来源:博客园
本文记录了不使用中间变量交换2个变量的value,很多的网络留言说是直接异或运算就可以了,而且效率很高,是真的吗?
这里简单的说一下我的环境:Win7 32位,Qt creator 5.4.1 编译器MinGW4.9.2 32bit 调试器:GNU GDB 7.8
关于这个问题,网络上面有很多的解释,3种方法,我这里给比较一下各自的优缺点,然后简单分析一下汇编代码,分析代码如下:

#include &stdio.h&
void swap1(int &a,int &b)
{
int temp =
b =
}
void swap2(int &a,int &b)
{
b = a -
a -=
}
void swap3(int &a,int &b)
{
a ^=//使用异或运算符
a ^=
}
//这是第三种的缺点,不能交换float
/*void swap3float(float &a,float &b)
{
a ^=//使用异或运算符
a ^=
}*/

void swap3char(char &a,char &b)
{
a ^=//使用异或运算符
a ^=
}

int main(void)
{
int a1 =1,b1 =2;
int a2 =3,b2 =4;
int a3 =5,b3 =6;
int a = ,b=1;
swap1(a1,b1);
swap2(a2,b2);
swap3(a3,b3);
printf("a1 = %d,b1 = %d\n",a1,b1);
printf("a2 = %d,b2 = %d\n",a2,b2);
printf("a3 = %d,b3 = %d\n",a3,b3);

swap2(a,b);
printf("a = %d,b = %d\n",a,b);

//
float a4=1.25,b4=2.51;
//
swap3float(a4,b4);
//
printf("a4 = %f,b4 = %f\n",a4,b4);

char a5 = 'a',b5 = 'b';
swap3char(a5,b5);
printf("a5 = %c,b5 = %c\n",a5,b5);
return 0;
}
/*
 * 三种交换方式,第一种属于教科书的方式,属于低级的
 * 第二种,加减运算时,可能会导致数据的溢出
 * 第三种方法最优。(但是float类型的不能交换)
*/

/*
a1 = 2,b1 = 1
a2 = 4,b2 = 3
a3 = 6,b3 = 5
a = 1,b = 
a5 = b,b5 = a
Press &RETURN& to close this window...

*/

通过上面的代码展示,你会发现,啊,原来最高效的运算是异或运算啊。定论别下的太早。看完下面的汇编,我想你心里就有数了。你不必知道汇编的语句,你只要会数代码的行数就OK了。
方法1,号称最笨的方法。汇编代码如下:

方法2,使用+-运算解决,汇编如下:

方法3,直接异或运算,汇编代码如下:

小结:
在我没有查看汇编代码以前,我也轻易了相信了网络上的留言,甚至某些书籍。在我写博客以前,我还在相信方法3是最高效的,因为它的思维最接近机器的运算的思维。我还在他人的面前显摆过自己。但是,现在,我明白了,只有代码会说实话。swap2和swap3的有效汇编代码都在21行,而swap1的只有14行,相互差距7行代码,当然了,如果你的变量开销很大的话,那么swap3是很好的,swap2也不错,就是注意一下运算的时候不要溢出就可以了。当然了,算法的好坏,都是相对了,要看具体的环境情况。现在我想说,遇到什么知识,能自己测试的,可以测试一下,实践是检验真理的唯一标准。
修改日期:
昨天睡的时候又在想这个问题,谁让咱是强迫症呢,觉得自己的想法太简单了,没有用时间来测试一下。今天看到1楼BYSF-XF的评论,更加让我下定决心用时间来测试一下了。测试的结果更是让我意外。我的环境已经在前面补充出来了。
首先是1楼的源码测试,结果如下,测试次数:0x7FFFFFFF:

从结果中,在我的环境上看到:使用swap4异或的效率确实不怎么好。我的机器和我的人一样笨笨的,接下来次数小一点吧,如下:

我使用了一个const常量来控制次数,这么多次,记得把下面的for循环也修改了。可以看到测试数据还是swap4异或很不理想。
修改日期:
今天得到1楼BYSF-XF的测试反馈,测试结果在3楼,我把结果移植到这里了。从下面的结果看,不同的编译器,会产生不同的效果。而且debug和release的区别更是显著,这主要是因为debug是调试用的,编译器没有对程序进行优化处理,而release是发布版本,编译器对程序都做了优化处理,使程序更快更小,所以最后产生0的结果,也就不意外了。

好了,本人只是闲的没事儿,喜欢纠结。如果您有什么好的发现,还请留言讨论,一起探索。有时候存有一颗质疑的心,还是会发现新东西的。
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动core java(21)
在程序中实现交换两个数的功能并不复杂,但如果不使用中间变量,就需要动一下脑筋。在本文介绍了两个方法(其实原理都是一个)。其基本原理就是数的中和。 也就是说,通过某种运算(二元运算)将a和b两个数变成一个数,并保存在其中一个变量中。然后再通过同样的运算符将a或b中和掉。这样实际上是利用了a或 b本身作为了中间变量。
static class Num
static void swap1(Num num)
&&& num.a = num.a
+ num.b;
&&& num.b = num.a
&&& num.a = num.a
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:470573次
积分:3783
积分:3783
排名:第8457名
原创:69篇
转载:84篇
评论:31条
(4)(3)(16)(5)(1)(10)(16)(4)(4)(7)(11)(7)(17)(20)(24)(5)鏌ョ湅: 4877|鍥炲?: 6
UID锛}

我要回帖

更多关于 java交换值 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信