`
dsea
  • 浏览: 44544 次
  • 性别: 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 ...

    GA两个变量求函数最小值.rar_sentmm6_交通 优化_交通优化_优化两个变量_分类

    标题中的“GA两个变量求函数最小值”指的是使用遗传算法(Genetic Algorithm,简称GA)来寻找一个多变量函数的最小值。遗传算法是一种基于生物进化原理的全局优化方法,尤其适用于解决多目标、多约束的复杂优化问题...

    单变量与双变量遗传算法的实现

    1. **初始化种群**:同样随机生成一定数量的个体,每个个体包含两个变量的初始值。 2. **编码**:将两个决策变量值分别转化为二进制编码。 3. **适应度函数**:计算每个个体的适应度值,考虑两个变量对目标函数的...

    TwinCAT3工程编译后变量不在相应task任务接口下的解决办法.docx

    这两种方法都是为了确保变量与正确的Task任务关联,从而避免因为变量定位错误导致的通信混乱。在编写代码时,务必在每个变量声明前加入对应的`TcContextName`或`TcContextId`属性,以便在编译后将变量定位到正确的...

    python语法特征包括多变量赋值、变量交换等

    在大多数编程语言中,交换两个变量的值通常需要一个临时变量。但在Python中,可以直接通过元组赋值的方式轻松实现变量交换: ```python x, y = 2, 4 x, y = y, x print("x:", x, "y:", y) # 输出: x: 4 y: 2 ``` ##...

    GA两个变量求函数最小值

    4. **交叉操作**:也称为重组或配对,随机选取两个个体进行基因交换,生成新的后代。对于两个变量的情况,可以采取简单的交叉策略,如单点交叉或均匀交叉,将两个个体的变量值在某个随机点上互换。 5. **变异操作**...

    jquery 两个表格数据行交换数据

    本文将深入探讨如何使用jQuery实现两个表格之间的数据行交换功能,这是一个常见的需求,特别是在用户界面设计中,用户可能需要重新排序或比较表格数据。 首先,让我们理解表格(TableView)的基本结构。在HTML中,...

    DH密钥交换,C++代码

    - `swap`: 用于交换两个变量值的宏。 接下来定义了一个二维数组 `p_set`,其中包含了预设的两个大素数 \( p \) 的字符串表示。 #### 2. 函数实现 - **`getn`**: 计算字符串的有效长度。 - **`mul`**: 实现两个大...

    C++函数模板

    根据题目要求,程序应当接收用户输入的两个整型数和两个字符,然后输出交换后的结果。例如,如果输入为`5 9`和`a b`,则输出应为`9 5`和`b a`。 #### 七、总结 本题目主要考察了函数模板的基本用法,包括如何定义...

    基本不变量神经网络解析梯度方法的研究.pdf

    2. **全同原子置换不变性**:在动力学模拟中,如果两个相同原子的位置互换,势能面的值应保持不变。解决这一问题通常需要对原子坐标进行排序,但这可能导致对称面上导数的不连续,影响动力学结果的准确性。 3. **...

    840D的PLC功能块FB2和FB3读写NC系统变量

    通过这两个功能块,用户可以在PLC程序中动态地访问NC系统的内部状态,并根据需要对其进行修改,从而实现更为复杂和灵活的控制逻辑。 #### 三、使用步骤详解 1. **启动NC变量选择器(NCVariableSelector)**: ...

    遗传算法求解负荷分配两变量函数

    在"遗传算法求解负荷分配两变量函数"这一主题中,我们将深入探讨如何利用遗传算法解决涉及两个变量的负荷分配问题。 负荷分配问题通常出现在资源管理、生产调度或工程设计等多个领域,目标是合理地分配有限的资源...

    GA_duogebianliang.zip_ga多变量_多变量GA_多变量ga算法_多变量遗传_遗传算法

    4. 交叉操作(Crossover):两个优秀个体通过某种方式交换部分基因(变量),生成新的个体。在多变量问题中,可以采用单点、多点或均匀交叉等方式。 5. 变异操作(Mutation):随机改变个体的一部分基因,引入新的...

    《Java编程语言:原理与范例》课后实验源代码.doc

    在第二章实验一中,我们看到一个关于变量交换的程序,要求不使用中间变量来交换两个变量的值。该程序使用了Java的基本数据类型和算术运算符来实现变量的交换。 该程序展示了Java中如何使用基本数据类型和算术运算符...

    duoweibianliang.rar_多维变量_多维遗传算法_最优算法_遗传算法 多维_遗传算法寻优

    4. 交叉(Crossover):选取两个或更多个体,交换它们的部分基因(变量),生成新的个体。交叉操作保持了种群的多样性。 5. 变异(Mutation):对部分个体进行随机变异,改变其一两个基因值,防止算法过早收敛到...

    动态规划之状态压缩归纳.pdf

    例如,可以不使用中间变量交换两个数,或者改变一个状态集合中某个状态的存在状态。 动态规划与状态压缩结合,可以显著减少所需的存储空间。在解决诸如旅行商问题(TSP)这样的 NP-Hard 问题时,如果状态空间过大,...

    最下生成树问题实习报告

    - Swapn:交换两个边的信息。 - Sort:对边按权值进行排序,通常在构建最小生成树前使用,以便优先选择权值最小的边。 - Find:查找给定顶点的祖先,用于判断是否形成环路。 - Kruskal:克鲁斯卡尔算法,它按照...

    数据结构 课程设计报告 最小生成树 源代码 C/C++

    - 通过 `Swapn(edge*, int, int)` 函数实现了两个边之间的交换,以便在排序过程中调整边的位置。 - 在 `MiniSpanTree` 函数中,首先构建了一个包含所有边的数组 `edges`,然后调用 `sort` 函数对其进行排序,最后...

    编译原理 代码生成 PPT

    对于非交换运算符,可能需要生成两个版本的代码以选取最佳序列。 - **数据结构支持**:寄存器描述符和地址描述符是重要的数据结构,它们分别跟踪寄存器和变量的当前状态,以便在生成代码时做出明智的决策。 总的来...

Global site tag (gtag.js) - Google Analytics