对于C语言中交换两个数的方法,目前大体上有这么5种:
1:直接利用中间变量进行交换;
2:利用指针传入函数地址在函数内部进行利用中间变量交换;
3:将两个需要交换的数进行加减运算进行交换;
注:因C语言有浮点数之分,不可以认为乘除也可进行交换。
4:将两个数进行亦或运算,也可以实现交换两个数的目的;
5:对两个数进行位操作,也可以实现交换两个数的目的。
接下来我将对后面三种进行分析:
前面两种太过常见,在此不做说明:
第三种:加减交换
将两个数之和赋值给第一个数,然后用新第一个数减去第二个数得到旧第一个数,并赋值给第二个数
,再用新第一个数减去新第二个数(旧第一个数)得到旧第二个数,并赋值给第一个数,在此,实现
两个数的交换,代码如下:
1 #include2 3 int main(){ 4 int a=10,b=20; 5 a+=b; 6 b=a-b; 7 a=a-b; 8 9 return 0; 10 }
注意:此法使用缺陷
当需要交换的两个数是指向同一下标的数组元素,那么此时,此法失效。
诸君请看:
1 #include2 3 int main(){4 int a[5] = { 1,2,3,4,5};5 int i=2,j=2;6 a[i] += a[j]; //因为i=j;所以此时a[i]=a[j]=2[i]; 7 a[j] = a[i] - a[j];//由上知,此时a[i]=a[j]=0;8 a[i] = a[i] - a[j];//此时两者均为0;交换失败 9 return 0;10 }
此外,使用此法时应注意两个数之和不能超过所定义的类型所能表达的最大数,不然也将交换失败
第四种:异或运算进行交换
在此,我先说一下异或运算的原理:两个数做异或运算,将两个数化为二进制,逐位比较,相同者得0,不同者得1;具体如下:
0 1 0 1 1 0 0 1
1 0 0 1 0 1 0 0
运算得 1 1 0 0 1 1 0 1
0 1 0 1 1 0 0 1
与第一个数 至此感悟,代码如下:
运算得 1 0 0 1 0 1 0 0
1 #include2 3 int main(){ 4 int a = 10,b = 20; 5 b ^= a; 6 a ^= b; 7 b ^= a; 8 9 return 0;10 }
注:和上一方法一样,此法在对数组使用时也受到相同的限制,但只需在对数组使用之前做一个,判断确保指向的不是同一个数,
那么我觉得这种方法应是最简单快捷的。
第五种:位运算进行交换
该方法也是基于二进制进行运算
首先带大家认识两个位运算符:>> 箭头朝右指,故右移运算符 << 箭头朝左指,故左移运算符
比如 5>>1 表示将5右移一位 --> 即 5的二进制 0 0 0 0 0 1 0 1 右移一位得 0 0 0 0 0 0 1 0 原本末尾的1被移走,高位补0;左移同理
注意:因右边是数据的最低位,所以当右移出去后,再左移是不能恢复到原来的数字的,但左移不同,左边剩下的高位都为0,都是存在的,当你的数
字不足够大时,左移之后是还可以通过右移恢复原数的
当想使用位运算交换两个数的时,应先对每个数实际二进制位数做简单估测,再确定所移动位数,下面为交换两个数的实例
1 #include2 3 int main(){ 4 int a = 5,b = 10; 5 a <<= 8; //将a移动到高位 6 a += b; //将b的值加到a移动之后的低位 7 b = a >> 8; //取a原来的值 8 a = a & 0xff ; //取新移进来的b,高位直接通过与运算赋值为0 9 10 return 0;11 }
注:上述代码中的&运算符运算原理和亦或相似,这个是如果两个都为1,则为1,否则为0;
当用此方法进行交换两个数时,一是两个 数的大小 比第三种方法还受限制,而且所移的位数不好确定,不推荐使用
第一次写博客,我知道肯定毛病颇多,望各位大佬口下留情,手下留情,多多指点;谢过谢过