黑马程序员技术交流社区

标题: 关于不使用第三方变量交换a,b的值 [打印本页]

作者: forDream    时间: 2014-1-26 15:40
标题: 关于不使用第三方变量交换a,b的值

关于不使用第三方变量交换a,b的值方法一:
a = a + b;
b = a - b;
a = a - b;
方法二:
a = a * b;
b = a / b;
a = a / b;
方法三:
a = a ^ b;
b = a ^ b;
a = a ^ b;
哪个方法好,方法三怎么个意思


作者: 黄志成    时间: 2014-1-26 17:45
^是异或的意思。即有且只有一个为真时,结果为真。
作者: MyFuture    时间: 2014-1-26 18:16
最后一个就是异或的意思,一般来说用第一个,简单明了,后面的只是能实现,不常用,也可以一句话进行赋值交换
y = x + (x = y) - x;  这样也可以
作者: 〃FelayMan。    时间: 2014-1-26 21:54
我觉得对于两个变量的交换,只要能建立起a,b之间的映射关系都能满足进行交换,,而且不用第三变量
作者: 卢必新    时间: 2014-1-29 11:06
本帖最后由 卢必新 于 2014-1-29 11:08 编辑

第三个的意思是不是:
a的a的b的平方次方次方

jieshi.jpg (30.91 KB, 下载次数: 69)

jieshi.jpg

作者: Lillian    时间: 2014-1-29 23:08
我认为, 这三个方法主要的区别在于运算效率,二级制运算的效率最高,加法次之,乘法最差。
从思想发面,方法一与方法二有异曲同工之妙,但是方法三是需要了解计算机底层才能编写出来的。
方法三是指采用二级制异或的特点:
一个数与本身异或运算得0x00000000; 0^0 = 0  1^1 = 0
一个数与0异或还是它本身  1^0 = 1; 0^0 = 0
假设a = 2 0x00000010; b = 3 0x00000011
下面为了看着方便,将每个数出现的次数作为后缀,对应地替换一下:
a = a ^ b;   a1 = a0 ^ b0  ;  
b = a ^ b;   b1 = a1 ^ b0  = a0 ^ b0 ^b0 = a0
a = a ^ b;   a2 = a1 ^ b1  = a0 ^ b0 ^a0 ^ b0 ^b0 = b0
作者: forDream    时间: 2014-1-31 10:13
Lillian 发表于 2014-1-29 23:08
我认为, 这三个方法主要的区别在于运算效率,二级制运算的效率最高,加法次之,乘法最差。
从思想发面,方 ...

会不会产生数据乘方后值过大,然后溢出啊
作者: Lillian    时间: 2014-1-31 14:01
forDream 发表于 2014-1-31 10:13
会不会产生数据乘方后值过大,然后溢出啊

我想你说的乘方是指 ^ 这个运算符号,它这里不是幂运算,而是二进制的异或运算,因此不会产生溢出的。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2