C++学习笔记27 交换两个数据swap
2017-11-02 16:39
417 查看
如何在不使用中间变量的情况下交换两个数据?
方法很多,不过需要通过多次的数值计算来完成交换,到现在知道的有下面三种:(1)加减法。
a = a + b; b = a - b; a = a - b;
该方法可以交换整型和浮点型数值的变量,但在处理浮点型的时候有可能出现精度的损失,例如对数据:
a = 3.123456 b = 1234567.000000
交换后各变量值变为:
a = 1234567.000000 b = 3.125000
很明显,原来a的值在交换给b的过程中发生了精度损失。
(2)乘除法。
a = a * b; b = a / b; a = a / b;
乘除法更像是加减法向乘除运算的映射,它与加减法类似:可以处理整型和浮点型变量,但在处理浮点型变量时也存在精度损失问题。而且乘除法比加减法要多一条约束:b必不为0。
可能经验上的某种直觉告诉我们:加减法和乘除法可能会溢出,而且乘除的溢出会特别严重。其实不然,采用这两种方法都不会溢出。以加减法为例,第一步的加运算可能会造成溢出,但它所造成的溢出会在后边的减运算中被溢出回来。
(3)异或法。
a ^= b;//a=a^b b ^= a;//b=b^(a^b)=b^a^b=b^b^a=0^a=a a ^= b;//a=(a^b)^a=a^b^a=a^a^b=0^b=b
异或法可以完成对整型变量的交换,对于浮点型变量它无法完成交换。
总结
不适用中间变量完成交换,那么就是时间换空间,就会多了计算时间,相关文章推荐
- c++指针学习笔记--交换两个字符串数据收藏
- c++指针学习笔记--交换两个字符串数据
- C#学习笔记--两个数据的交换
- java中交换两个基本数据类型的变量函数swap怎么写
- java学习——使用Exchanger实现两个线程间的数据交换
- 2012/1/9 《C++ Primer Plus》第三章:处理数据 学习笔记
- MFC学习笔记之Invalidate的用处及对话框数据交换及实现文字背景色为透明
- Effective C++ 学习笔记(27)
- C++基础教程 学习笔记(一) C++的数据类型和修饰符
- Android应用开发学习笔记之使用Bundle交换数据
- C++学习笔记(三)复合数据类型
- C++复合数据类型数组学习笔记
- 【学习点滴-数据结构-单链表】交换单链表中任意两个元素
- [BizTalk][Adapter][部署]BTS学习笔记1:建立一个简单的Biztalk数据交换项目(一)
- C++数据的封装和类体内定义成员函数的学习笔记
- C++学习笔记--数据类型
- C/C++语言的点滴(一) -- 实现两个任意类型的数据的交换
- c++学习系列笔记之数据处理(总括)
- C++学习笔记之数据类型杂记
- C++学习系列笔记之数据处理(整形数据)