大家好,欢迎来到IT知识分享网。
两数交换方法
在c语言中,将两个数进行交换,我知道的方法有4种,我自己倾向于方法3。
方法1
#define SWAP1(a, b) {a = a + b; b = a - b; a = a - b;} void swap1(int* a, int* b) {
if (a == b) return; *a = *a + *b; *b = *a - *b; *a = *a - *b; } int a = 5; int b = 15; int c = 5; //SWAP1(a,a); //a的值为0 //SWAP1(a,c); //a,c的值不变 //SWAP1(b,c); //b,c的值交换 //swap1(&a,&a); //a的值不变 //swap1(&a,&c); //a,c的值不变 //swap1(&b,&c); //b,c的值交换
方法2
异或交换
相同为0,相异为1
x^1 = !x x与1异或,x取反 —> 与1异或取反
x^0 = x x与0异或,x不变 —> 与0异或不变
value | value | |
---|---|---|
a | b | |
a=a^b | a^b | b |
b=a^b | a^b | a ^ b ^ b=a^0=a |
a=a^b | a ^ b ^ a | a |
b | a |
因为a ^ b=b ^ a 满足交换律,所以 a ^ b ^ a = b ^ a ^ a = b。
注意:
- 对同一个变量自身进行swap,结果为0;
- 对两个值相等的变量进行swap,显然两个变量的值不变;
介绍完异或交换的原理,接下来,上代码
#define SWAP2(a, b) {(a) ^= (b) ^= (a) ^= (b);} int a = 5; int b = 5; int c = 5; SWAP2(a,a);//a的值为0 SWAP2(b,c);//b和c的值仍为5
所以在使用SWAP2(a,b)时,需要注意a,b不能是同一个变量。当然也可以将异或交换定义成函数
void swap2(int* a, int* b) {
if (a == b) //判断a,b是否是同一个变量 return; (*a) ^= (*b) ^= (*a) ^= (*b); } int a = 5; int b = 15; int c = 5; swap2(&a,&a); swap2(&b,&c); printf("a=%d, b=%d, c=%d\n", a, b, c); //a=5, b=5, c=15
方法3
#define SWAP3(a, b) {a = a+b-(b=a);} int a = 5; int b = 15; int c = 5; //SWAP3(a,a); //a的值不变 //SWAP3(a,c); //a,c的值不变 //SWAP3(b,c); //b,c的值交换
方法4
最简单直接的方法
#define SWAP4(a, b) ({int tmp = 0;tmp = a;a = b;b = tmp;}) void swap4(int* a, int* b) {
int tmp = 0; tmp = *a; *a = *b; *b = tmp; } int a = 5; int b = 15; int c = 5; //swap4(&a,&a); //a的值不变 //swap4(&a,&c); //a,c的值不变 //swap4(&b,&c); //b,c的值交换
讨论群:
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/150569.html