`
dsea
  • 浏览: 43910 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

不生成中间变量,交换两个数

阅读更多

最近看深入理解计算机系统这本书时,在第二章有个练习题,在不生成中间变量的情况下,交换两个数。代码如下:

 

 

void swap(int *x, int *y) {
	 *y = *x ^ *y; /*Step 1*/ 
	 *x = *x ^ *y; /*Step 2*/ 
	 *y = *x ^ *y; /*Step 3*/ 	 
}

 

 

这个过程的效果是交换指针变量x和y所指向的存储位置处存放的值。这与通常的交换两个数值的方法不一样,当移动一个值时,我们不需要第三个位置来临时存储另一个值。不过,书上说这种方式并没有性能上的优势,这个就不太清楚了,按理说,程序运行过程中,节省了一部分存储空间,应该会有那么点优势的。不过,可能是生成一个临时变量的开销也是极小的,而且代码易读性较强,所以推荐使用。下面以一个表格的形式,来展现一下这个方法的执行过程(有关异或的内容可以参见前一篇博文:http://dsea.iteye.com/admin/blogs/1079580)(a^a = 0):

 

步骤 *x *y
 初始  a    b
第一步 a a^b
第二步 a^(a^b) a^b
 第三步 b b^a^b = a

 

分享到:
评论

相关推荐

    实现两个数互换的六种方法

    * 方法一:实现两个数交换 **/ public class Exchange1 { public static void main(String[] args) { /** * 随机生成两个固定序列的0-100之间的整数, * 其中101表示生成的数范围区间在:[0-101) */ Random ...

    泊松过程的生成及其统计分析

    假设一个交换系统有M部电话,每个用户在很短的时间 (单位时间)内呼叫一次的概率为P;用户间呼入的时刻相互独立,当M很大,P很小时,时间t内到达交换机的呼叫次数构成泊松过程 。 1. 确定此泊松过程的参数 ; 2. ...

    VBA进行CAD二次开发常用函数与算法.txt

    交换两个数组变量 给任用一个实体绘制边框 将三个变量转换成一个点坐标变量 通过两个对角点绘制矩形 判断三点是否共线 自动生成国标图框 返回实体的中心点 返回任意“曲线”的长度 空间平面方程 线性方程组...

    javascript入门笔记

    2、如果 a 大于 b的话 ,则交换两个数字的位置 使用 短路&&,扩展赋值运算符,位运算 4、条件运算符(三目运算) 单目(一元)运算符 :++,--,! 双目(二元)运算符 :+,-,*,/,%,>,<, ... ... 三目(三元)运算符 ...

    Python-codes_Exp1_55:#实验1#1。 Python程序,用于计算三角形,正方形和矩形#2的面积。 解决二次方程式#3的Python程序。 交换两个变量的Python程序#4。 生成随机数#5的Python程序。 Python程序,可将公里转换为英里,将摄氏度转换为华氏度,以及其他转换

    Python代码_Exp1_55 #实验1#1。 Python程序,用于计算三角形,正方形和矩形#... 交换两个变量的Python程序#4。 生成随机数#5的Python程序。 Python程序,可将公里转换为英里,将摄氏度转换为华氏度,以及其他转换

    你必须知道的495个C语言问题

    3.15 我要检查一个数是不是在另外两个数之间,为什么if(abc)不行? 3.16 为什么如下的代码不对?inta=1000,b=1000;longintc=a*b; 3.17 为什么下面的代码总是给出0?doubledegC,degF;degC=5.0/9*(degF-32); ...

    Python案例集锦-0414.docx

    程序20: 变量交换 17 程序21: 质数判断 17 程序22: 简单计算器 18 程序23: 最大公约数 20 程序24: 最小公倍数 21 程序25: 字符串判断 22 程序26: 合并文件数据 23 程序27: 猜数游戏 24 程序28:为数据加密 ...

    discreteMCMC:离散数组变量可逆跳转MCMC

    计算前后的后验,计算两个模型之间的贝叶斯因子。 如果u2 <贝叶斯因子,则生成另一个统一的随机变量u2并接受建议。 用法 import numpy as np from scipy . stats import bernoulli import matplotlib . pyplot ...

    数据结构与算法.xmind

    递归拆分出两个有序的数组,从mid的位置开始拆分,递归出口:只有一个值的时候就不用拆分了 合并两个有序的数据 分别往两个数组填充已有序的数据 比较两个数组的值谁小,谁小就放到我们的...

    《你必须知道的495个C语言问题》

    3.15 我要检查一个数是不是在另外两个数之间,为什么if(a b c)不行? 40 3.16 为什么如下的代码不对?int a=1000, b=1000; long int c=a * b; 40 3.17 为什么下面的代码总是给出0?double degC, degF; degC= ...

    700个批处理打包下载.rar

    交换两个变量的值而不使用临时变量.bat 交换两个变量的值而不使用临时变量.cmd 人民币大小写互转程序.cmd 人民币金额小写转大写.cmd 今天访问过的程序文件所在目录.cmd 以文件夹名为名建立文本文件.cmd 使用WMI别名...

    Python经典面试题 Python常见面试考试题目整理总结 Python面试题手册 共15页.pdf

    Python经典面试题 Python常见面试...15:有两个序列 a,b,大小都为 n,序列元素的值任意整形数,无序;要求:通过交换 a,b 中的元素,使[序列 a 元素的和]与[序列 b 元素的和]之间的差最小 16:用 Python 匹配 HTML tag

    linux下几种最常用的IPC接口,这样一来,统一了接口,提高代码重用性.rar

    任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核...

    通信网络MATLAB编程

    假设一交换系统有M部电话,每个用户在很短时间 呼叫一次的概率为P;用户间呼入的时刻相互独立,当M很大,P很小时,时间t内到达交换机的呼叫次数构成泊松过程N(t) 1. 确定此泊松过程参数 2. 利用计算机仿真N(t)的...

    logica-de-programacao:99个编程逻辑问题

    用C编程逻辑 99个编程逻辑问题 ...编写一个程序,该程序交换两个整数变量的值。 19.编写一个程序,计算一级方程的根。 20.商店在输入系统中加上两个批次来销售其产品,该条目大于或等于两个批次,两个批次必

    C语言FAQ 常见问题列表

    o 4.4 这是个巧妙的表达式: a ^= b ^= a ^= b 它不需要临时变量就可以交换 a 和 b 的值。 o 4.5 我可否用括号来强制执行我所需要的计算顺序? o 4.6 可是 && 和 || 运算符呢?我看到过类似 while((c = getchar())...

Global site tag (gtag.js) - Google Analytics