交换两个基本数据类型变量的值
已知两个基本数据类型的变量a、b,要求交换两个变量的值。下面以double类型为例进行说明:
1. 借助于临时变量的方式
int main(int argc, char *argv[]) {
double a = 10.5;
double b = 20.4;
// 1. 先暂存变量a的值到临时变量tmp中
double tmp = a;
// 2. 变量b的值赋值给变量a(即,此时变量a的值是原先变量b的值)
a = b;
// 3. 将原先暂存到变量tmp中的变量a的值 赋值给 变量b
b = tmp;
printf("a = %lf, b = %lf", a, b); // 输出:a = 20.400000, b = 10.500000
}
将其封装成一个函数如下:
// 交换两个double变量的值
void swapDouble(double *a, double *b)
{
double tmp = *a;
*a = *b;
*b = tmp;
}
// 具体使用
double a,b;
swapDouble(&a, &b); // 需要传递两个变量的地址指针,才能在swapDouble方法内修改方法外两个变量a、b的值
2. 两个变量相互加减的方式
void swapDouble(double *a, double *b)
{
*a = *a + *b; // a的新值为:原先a 和原先b 的和
*b = *a - *b; // b的新值为 (原先a + 原先b) - 原先b = 原先a 的值
*a = *a - *b; // b的新值为 (原先a + 原先b) - 原先a(即b的新值) = 原先a 的值
}
3. “异或”位运算的方式
位运算操作是由处理器支持的底层操作,因此运行速度很快。尽管现代计算机处理器拥有了更长的指令流水线和更优的架构设计,使得加法和乘法运算几乎与位运算一样快,但是位运算消耗更少的资源。
注意:该方式仅仅适用于两个整数类型变量之间的交换
void swapInt(int *a, int *b)
{
*a = (*a)^(*b);
*b = (*a)^(*b);
*a = (*a)^(*b);
}
补充内容
异或的规则:
如果a、b两个值不相同,则异或结果为1。
如果a、b两个值相同,异或结果为0。
按位异或的3个特点:
0^0=0,0^1=1
0
异或任何数
=任何数
1^0=1,1^1=0
1
异或任何数
等价于任何数取反
任何数
异或自己
=把自己置0
按位异或的几个常见用途:
1. 使某些特定的位翻转
例如对数10100001的第2位和第3位翻转,则可以将该数与00000110进行按位异或运算。
10100001^00000110 = 10100111
2. 实现两个值的交换,而不必使用临时变量。
例如交换两个整数a=10100001,b=00000110的值,可通过下列语句实现:
a = a^b; // a=10100111
b = b^a; // b=10100001
a = a^b; // a=00000110
3. 在汇编语言中经常用于将变量置零:
xor a,a
4. 快速判断两个值是否相等
举例1: 判断两个整数a,b是否相等,则可通过下列语句实现:
return ( (a^b) == 0 );
网友评论