主题:【原创】继续关于swap的讨论 -- 不锈钢破锣
- 共: 💬 22 🌺 5
都知道程序设计里的swap()吧。一般是这么写的:
temp=a;
a=b;
b=temp.
如果不用临时变量,只用a,b这两个变量和算术运算该怎么办呢?再推广到逻辑门运算又该怎么办呢?
答案不是唯一的,楼下的朋友给的回答可以算其中之一,但还可以简化到三步:
a = a+b; (a:a+b, b:b)
b = a-b; (a:a+b, b:a)
a = a-b; (a:b, b:a)
推而广之,如果用一个实数域上的可交换运算符,比如*,来替换+,再用它的逆运算符,比如/,替代-, 结果同样成立。
但是,当应用于计算机时,答案中给出的交换方式有两个问题,一个问题是临时结果可能溢出(如果用*和/,会发生除0),另一个问题是精度可能降低。所以这样的方法不适用于传统计算机结构。
如果把一个变量看成一个二进制数组A(1),A(2),...,A(i),...,A(n), 现在再来看逻辑运算符XOR:
A(i) = A(i) XOR B(i);
B(i) = A(i) XOR B(i);
A(i) = A(i) XOR B(i);
这个表达方式很有意思,同样可以起到交换的作用,而且解决了上面的溢出和精度问题。
那为什么现在比较常用的方法还是使用临时变量呢?两个原因,一个是赋值运算比逻辑运算的速度更快;另一个是在编程方面,使用临时变量可读性更高。
从题目一开始就可以知道,新的运算方式节省了一个临时变量。这在传统计算机结构下是无足轻重的,但是,如果应用到新的计算机机构,比如量子机或者神经网络机,就需要重新衡量不同方法的效率。
从上面的例子可以看出,哪怕最简单的计算机问题,都未必是单一最优解的,原因主要在於问题的解决域不是单一的,从而导致最优解的衡量方式不同。也就是说,计算机科学所研究的往往不是地球围绕太阳转这一类普适性问题,而是条件约束问题。这也是计算机科学与物理之类自然科学在方法论上的主要区别。很可惜的是,当自然科学的方法论已经系统化时,计算机科学的方法论研究还不太成熟。关于这个问题,以后慢慢再谈。
本帖一共被 1 帖 引用 (帖内工具实现)
- 相关回复 上下关系8
【原创】继续关于swap的讨论
😉有意思的问题 ericxy 字360 2006-11-06 00:51:50
😏呵呵,这个答案有问题 Andor 字513 2006-11-01 12:09:43
🙂【原创】补充一点 无斋主人 字686 2006-10-29 00:30:46
😉有重大问题请教----- 1 觉昌安塔克世 字513 2006-10-27 15:38:47
🙂放到寄存器呀。。。 大大的熊 字0 2006-10-28 14:06:49
🙂不管放到什么地方, 觉昌安塔克世 字78 2006-10-28 17:07:59
🙂是这样的,首先寄存器的读取速度远远快于内存。 kavin 字628 2006-10-30 03:28:59