通过异或位交换两个整型变量的一个不容易注意的细节

设变量 a = 1, b = 2, 我们要交换两个变量的值, 当用异或交换两个值的时候会有一个小问题

用位运算大概是这个样子的

 1 #include<bits/stdc++.h>
 2
 3 using namespace std;
 4
 5 void swap(int& a, int &b) {
 6     a ^= b;
 7     b ^= a;
 8     a ^= b;
 9 }
10
11 int main() {
12     int a = 2, b = 3;
13     cout << "before swap a = " << a << " b = " << b << endl;
14     swap(a, b);
15     cout << "after swap a = " << a << " b = " << b << endl;
16     return 0;
17 }

能够正确交换两个变量的值, 但是我们有时候往往交换的是数组中的两个值, a[i] 和 a[j]

当i ==j的时候调用就会出错, 因为两个参数对应同一个引用, 而一个数和自己异或是0, 则a[i]就被赋值为0了, 其它的信息就找不会来了, 就出现了错误!

改正的办法还得加一个中间变量:

1 void swap(int& a, int &b) {
2     int c = a ^ b;
3     b = c ^ b;
4     a = c ^ a;
5 }

那这样就不如直接拿中间变量赋值了, 不用做异或了

时间: 2024-08-09 02:18:52

通过异或位交换两个整型变量的一个不容易注意的细节的相关文章

使用异或运算交换两个任意类型变量

这篇文章中将使用C语言,实现交换两个任意类型变量的功能.说到任意类型用C让人感觉很难做,如果是C++则使用模板函数就轻松搞定: template<class T> inline void swap(T& t1, T& t2) { T tmp; tmp = t1; t1 = t2; t2 = tmp; } 先说下使用^来交换两个整数,其代码看着简单但不容易理解 a ^= b; b ^= a; a ^= b; 有人说这种写法很奇葩,但我要说的是,异或运算是计算机很常用的操作.搞懂这

为什么三次异或操作可以交换两个数

a和b是两个整数,经过以下三次异或操作,可以达到交换目的:a = a ^ b;b = a ^ b;a = a ^ b; 首先要理解,什么是^(异或)操作: 二进制两数运算结果: 0 ^ 0 = 0 0 ^ 1 = 1 1 ^ 0 = 1 1 ^ 1 = 0相同为0,不同为1 假设: a = 10 , 其二进制数为: 1010 b = 12 , 其二进制数为: 1100如果a和b交换,在二进制数看来,因为第一位和最后一位数相同,所以中间两位数只要交换一下就行了这个交换的过程,因为二制进中只有两个数

交换两个整型变量的值

#include<stdio.h> #include<stdlib.h> int main() {     int a = 1; int b = 2; int tmp = a; a = b; b = tmp; printf("a = %d b = %d\n",a,b); system("pause"); return 0; } 上面是用创建中间变量的方法交换,下面是不创建中间变量的另一种方法:      a = a+b; b = a-b; a

交换两个整型变量值的方法

方法一: 创建临时变量 #include<stdio.h> #include<stdlib.h> int main() { int a = 1, b = 2; int temp = a;//创建临时变量temp a = b; b = temp; printf("a=%d,b=%d", a, b); system("pause"); return 0; } 方法二: 通过异或 #include<stdio.h> #include&l

用异或来交换两个变量能提高速度是错误的

在进行两个变量的时候,经常会看到有些书误人子弟的推荐使用异或的方式: 方式一 { x = x ^ y; y = x ^ y; x = x ^ y; } 而不是采用临时变量实现交换: 方式二 { int temp; temp = a; a = b; b = temp; } 美其名曰:节省内存,提高运行速度. 临时变量交换的方式: 但是,真的节省了内存吗? 使用这种方式大部分时候,没有节省内存.因为,一般情况下编译器会将方式二中的临时变量优化到寄存器中,不使用堆栈. 真的提高了运行速度吗? 下边的博

交换两个整型变量的数值

#include<stdio.h>void swap(int *p,int *q){ int t;t=*p; *p=*q; *q=t;}main(){ int a=5,b=4,*p,*q;p=&a; q=&b;swap(p,q);printf("a=%d b=%d",a,b);return 0;} 总结: 1,swap是用户定义的函数,它的作业是交换量(a和b)的值,它的形参p和q是指针变量. 2,程序运行时,先执行mian函数 ,输入a和b的值.然后将a和

不用中间变量,交换两个整型变量

突破口:用其中一个变量暂存两者的和. a = a + b; b = a - b;  //此时b已经是a a = a - b;  //相当于(a + b) - a = b

异或交换两个数的陷阱【转】

前面我们谈到了,可用通过异或运算交换两个数,而不需要任何的中间变量. 如下面: void exchange(int &a, int &b) { a ^= b; b ^= a; a ^= b; } 然而,这里面却存在着一个非常隐蔽的陷阱. 通常我们在对数组进行操作的时候,会交换数组中的两个元素,如exchang(&a[i], &b[j]), 这儿如果i==j了(这种情况是很可能发生的),得到的结果就并非我们所期望的. void main() { int a[2] = {1, 

用异或实现交换,可不用中间变量

前面我们谈到了,可用通过异或运算交换两个数,而不需要任何的中间变量. 如下面: void exchange(int &a, int &b) { a ^= b; b ^= a; a ^= b; } 然而,这里面却存在着一个非常隐蔽的陷阱. 通常我们在对数组进行操作的时候,会交换数组中的两个元素,如exchang(&a[i], &b[j]), 这儿如果i==j了(这种情况是很可能发生的),得到的结果就并非我们所期望的. void main() { int a[2] = {1,