两个数交换,不使用第三个空间
2012-02-07 15:54
232 查看
昨天在一个技术群中,一大堆人讨论“两个数交换,不使用第三个空间”这个问题。当时我给了个答案。
a = a + b;
b = a - b;
a = a - b;
不过后来发现有数据溢出的问题,比如函数void ChangeAB(int a, int b);如果a = int.MaxValue - 10, 30;(int.MaxValue = 2147483647)那么就会出现数据溢出的问题。虽然说最后两个数字是互换了,但是总觉得不好,后来我又给了个答案:
a = a ^ b;
b = a ^ b;
a = a ^ b;
结果一些群友没明白啥意思,当时我建议大家补习一下异或的知识。今天抽空,在这里给大家补充一下第二种方法的解释。在解释之前需要学习一下“^”是什么。“^”是异或的意思。如果学习过离散相信没人不知道“异或”吧。我们的计算机是2进制,就是“0”和“1”,那么01之间的异或关系就是下列样子:
0 ^ 0 = 0;
0 ^ 1 = 1;
1 ^ 0 = 1;
1 ^ 1 = 0;
知道了异或关系,
a = a ^ b;
b = a ^ b;
a = a ^ b;
就十分好解释了。 我已10和15为例。比如调用void ChangeAB(int a, int b);的语句为:this.ChangeAB(10, 15);其处理步骤为:
1、将10和15转化成二进制
00000000000000000000000000001010
00000000000000000000000000001111(第32的0代表是正数)
2、下面我开始翻译
“a = a ^ b;"为:
a = 00000000000000000000000000001010 ^ 00000000000000000000000000001111 = 00000000000000000000000000000101
"b = a ^ b;"为:
b = 为:00000000000000000000000000000101 ^ 00000000000000000000000000001111 = 00000000000000000000000000001010
"a = a ^ b;"为:
a = 为:00000000000000000000000000000101 ^ 00000000000000000000000000001010 = 00000000000000000000000000001111
所以输出时:
a = 00000000000000000000000000001111 = 15,
b = 00000000000000000000000000001010 = 10。
此式子的优势是无需考虑正负问题,也无需考虑数据溢出问题。
a = a + b;
b = a - b;
a = a - b;
不过后来发现有数据溢出的问题,比如函数void ChangeAB(int a, int b);如果a = int.MaxValue - 10, 30;(int.MaxValue = 2147483647)那么就会出现数据溢出的问题。虽然说最后两个数字是互换了,但是总觉得不好,后来我又给了个答案:
a = a ^ b;
b = a ^ b;
a = a ^ b;
结果一些群友没明白啥意思,当时我建议大家补习一下异或的知识。今天抽空,在这里给大家补充一下第二种方法的解释。在解释之前需要学习一下“^”是什么。“^”是异或的意思。如果学习过离散相信没人不知道“异或”吧。我们的计算机是2进制,就是“0”和“1”,那么01之间的异或关系就是下列样子:
0 ^ 0 = 0;
0 ^ 1 = 1;
1 ^ 0 = 1;
1 ^ 1 = 0;
知道了异或关系,
a = a ^ b;
b = a ^ b;
a = a ^ b;
就十分好解释了。 我已10和15为例。比如调用void ChangeAB(int a, int b);的语句为:this.ChangeAB(10, 15);其处理步骤为:
1、将10和15转化成二进制
00000000000000000000000000001010
00000000000000000000000000001111(第32的0代表是正数)
2、下面我开始翻译
“a = a ^ b;"为:
a = 00000000000000000000000000001010 ^ 00000000000000000000000000001111 = 00000000000000000000000000000101
"b = a ^ b;"为:
b = 为:00000000000000000000000000000101 ^ 00000000000000000000000000001111 = 00000000000000000000000000001010
"a = a ^ b;"为:
a = 为:00000000000000000000000000000101 ^ 00000000000000000000000000001010 = 00000000000000000000000000001111
所以输出时:
a = 00000000000000000000000000001111 = 15,
b = 00000000000000000000000000001010 = 10。
此式子的优势是无需考虑正负问题,也无需考虑数据溢出问题。
相关文章推荐
- 不使用第三个变量,实现两个数交换
- 现有1,2……一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度为O(1),使用交换,而且只能交换两个数
- 在不使用额外空间,交换两个数
- 现有1,2……一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度为O(1),使用交换,而且只能交换两个数
- 不使用第三个变量交换两个数的值
- 不使用第三个变量,交换两个数
- 两个数互换,不使用第三个空间
- 如何不使用第三个变量来交换两个数的值
- 不使用额外空间来交换两个数
- 【刷题之路】不使用额外空间交换两个数
- 交换两个数的值(不使用第三个变量)
- 两个数互换,不使用第三个空间
- 如何不使用第三个变量来交换两个数的值
- 使用指针交换两个数的值 并且定义三个整型和三个整形变量且只用指针给三个数排序
- java不使用中间变量交换两个数
- 交换两个数的值以及不使用临时变量交换两个数的值
- 交换两个变量的值,不使用第三个变量
- 如何在不使用第三个变量的情况下交换两位数的值
- 不使用中间变量交换两个数的值
- 不使用第三个变量,交换A、B变量值