经典的Swap
几乎从远古时代至今的每一本程序设计语言的教材上, 都可以看到一个叫swap的函数, 书上这样告诉我们:(以C语言为例)
在时下最时尚的C#中,我们可以这样写:
上面的C#代码和前面的C大同小异,无非只是体现了一下C#泛型的优越性. 然而有的语言则要飘逸的多,比如说python,它可以支持以下写法:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->a,b=b,a
呃,这只是一个表达式。不需要什么函数,不需要引用,最重要的是不需要麻烦临时变量
使用XOR的Swap
如果赋值运算符两边不支持多个操作数是不是就非要使用临时变量呢?那倒未必,请看下面的C代码:
为什么异或有这样的功能呢?其实是由以下两个性质决定的:
1.b ^ a =b ^ a (交换律)
2.a ^ a = 0 (由异或的定义)为了说明问题,这里我们将上述的函数展开并重新标记变量:
a1 = a ^ b
b1 = b ^ a1 = b ^ (a ^ b) = a ^ (b ^ b) = a
a2 = a1 ^ b1 = a ^ b ^ a = b ^ (a ^ a) = b
我们的swap中都应该选择XOR吗?
No,看上去这种不引入临时变量的写法的确比较屌,使用XOR做置换也的确比赋值要高效,但在背后,XOR也会带来一些隐患。例如:
这段代码中,我们期待的输出应该是:a = 2, b =2,因为两个同样的数经过交换应该还是一样的(=2)。但是根据先前提到的
第2条规律,由于这里a,b都指向i的位置,所以这里swap2(a,b)=i^i=0;结果竟然等于“0”!。谁会想到一个小小的swap函数居然会弄丢数据。这对调试程序来说无疑增加了难度。所以代码还是写得越“老实”越好维护,正如大神Kernighan所言:
“Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.”
Freesc
2009年7月29日
分享到:
相关推荐
能够实现参数的交换,swap函数利用变量的引用实现
这是交换两个数的C++函数,通过引用传参成功在函数中实现交换两个参数
v881开启swap教程,里面有详细说明!欢迎下载!
swap函数几乎是所有初学者都写过的一个最基本的函数之一,通常是用它来了解函数概念、形参与实参、引用和指针。然而,这个极为基础的函数却有着非常重要的作用。正因为它的重要性、普遍性,意味着swap函数必须有着极...
swap logisim emmm 电路
本版本适用于CPU换脸:只需安装Anaconda3-2023.03-Windows-x86_64、解压faceswap-master,再用Anaconda配置faceswap-master即可完成部署 Anaconda3是CMD命令行工具,用于使用Anaconda命令部署和启动faceswap-master...
swap电路:当输入c=0时,输出x等于输入a,输出y等于输入b。当输入c=1时,则交换两输出,即输出y等于输入a
faceswap完整项目!
用于查看LINUX下进程占用SWAP大小
增大swap分区.txt增大swap分区.txt增大swap分区.txt增大swap分区.txt增大swap分区.txt增大swap分区.txt增大swap分区.txt增大swap分区.txt增大swap分区.txt
修改swap分区大小方法,如果安装完linux后感觉swap分区不够用,可以尝试此方法。
在说C++模板的方法前,我们先想想C语言里面是怎么做交换的。 举个例子,要将两个int数值交换,是不是想到下面的代码: 如果要求不用临时变量,可考虑异或的方式...上面的std::swap要求T类实现拷贝构造函数,并且和上面
如果你的硬盘空间已经全部分配给其他分区,也没有多余的预算新添购硬盘,可以利用swap文件的方式增加虚拟的swap空间,不过执行性能会较实际的swap分区差。
Swap的调整对Linux服务器,特别是Web服务器的性能至关重要。通过调整Swap,有时可以越过系统性能瓶颈,节省系统升级费用。Swap空间的作用可简单描述为:当系统的物理内存不够用的时候,就需要将物理内存 中的一部分...
openwrt swap启用脚本
SWAP 使用logisim实现swap功能
Linux修改Swap大小.
windows下浏览ext、swap分区
使用python完成的faceswap程序,使用单张图片完成对人脸的三维建模