局部变量、按位异或、加减运算交换两数的值—C/C++程序基础(六)

目录

 

使用局部变量temp完成交换(最优)

使用按位异或运算完成交换(次优)

使用加减运算完成交换(最差)

三种方式优缺点总结


使用局部变量temp完成交换(最优)

#include<iostream>
#include <stdio.h>

void swap1(int& a, int& b)
{
	int temp = a;
	a = b;
	b = temp;
};

int main()
{
	int x = 5, y = 8;
	printf("x:%d, y:%d\n", x, y);
	swap1(x, y);
	printf("x:%d, y:%d\n", x, y);
	system("pause");
	return 0;
}

完成交换: 

使用按位异或运算完成交换(次优)

异或的运算规则是:对于将参与运算的两数各对应的二进制位相异或,如果各个二进制位的两个值不相同,则异或结果为1。如果各个二进制位的两个值两个值相同,异或结果为0。之后,再把二进制位转换为十进制位,输出结果。

a

b

a⊕b

1

0

1

1

1

0

0

0

0

0

1

1

#include<iostream>
#include <stdio.h>

void swap3(int& a, int& b)
{
	a ^= b;
	b ^= a;
	a ^= b;
};

int main()
{
	int x = 5, y = 8;
	printf("x:%d, y:%d\n", x, y);
	swap3(x, y);
	printf("x:%d, y:%d\n", x, y);
	system("pause");
	return 0;
}

完成交换: 

这是一个奇特的现象,如果对应的二进制位相同,则结果为0,否则结果为1,这样,连续运算3次即可交换a,b的值。

使用加减运算完成交换(最差)

#include<iostream>
#include <stdio.h>

void swap2(int& a, int& b)
{
	a = a + b;
	b = a - b;
	a = a - b;
};

int main()
{
	int x = 5, y = 8;
	printf("x:%d, y:%d\n", x, y);
	swap2(x, y);
	printf("x:%d, y:%d\n", x, y);
	system("pause");
	return 0;
}

完成交换: 

三种方式优缺点总结

以上三种方法,用加减法来实现交换的时候,有可能会发生数据溢出的问题,相比于此的话,用按位异或的方式和设定临时变量的方式就安全的多。但是,用按位异或的方式时,每次都需要读取两个数据到寄存器中,再进行运算操作,之后把结果写回到变量中,前后共需要三次内存写入操作。,效率很低,而且,会造成代码的可读性非常差,最重要的是,如果使用C语言实现上述两种方法,并用gcc编译器编译,可以使用命令 gcc -S swap.c 查看相应的汇编代码,临时变量法代码行数更少,另外使用 gcc 编译器时,用异或运算交换数组会出错。故,采用临时变量的方式,每次赋值只要读取一个变量的值到寄存器,然后再从寄存器写回到另一个变量中即可,前后涉及两次内存写入操作,相比之下更安全,更高效!

发布了271 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_17846375/article/details/104893382
今日推荐