网站首页 > 技术文章 正文
对于C语言中交换两个数的方法,目前大体上有这么5种:
1:直接利用中间变量进行交换;
2:利用指针传入函数地址在函数内部进行利用中间变量交换;
3:将两个需要交换的数进行加减运算进行交换;
注:因C语言有浮点数之分,不可以认为乘除也可进行交换。
4:将两个数进行亦或运算,也可以实现交换两个数的目的;
5:对两个数进行位操作,也可以实现交换两个数的目的。
接下来我将对后面三种进行分析:
前面两种太过常见,在此不做说明:
第三种:加减交换
将两个数之和赋值给第一个数,然后用新第一个数减去第二个数得到旧第一个数,并赋值给第二个数
,再用新第一个数减去新第二个数(旧第一个数)得到旧第二个数,并赋值给第一个数,在此,实现
两个数的交换,代码如下:
加下群 590750544 (群公告有大量学习资料和工具及教学视频)
注意:此法使用缺陷
当需要交换的两个数是指向同一下标的数组元素,那么此时,此法失效。
诸君请看:
加下群 590750544 (群公告有大量学习资料和工具及教学视频)
此外,使用此法时应注意两个数之和不能超过所定义的类型所能表达的最大数,不然也将交换失败
第四种:异或运算进行交换
在此,我先说一下异或运算的原理:两个数做异或运算,将两个数化为二进制,逐位比较,相同者得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
加下群 590750544 (群公告有大量学习资料和工具及教学视频)
注:和上一方法一样,此法在对数组使用时也受到相同的限制,但只需在对数组使用之前做一个,判断确保指向的不是同一个数,
那么我觉得这种方法应是最简单快捷的。
第五种:位运算进行交换
该方法也是基于二进制进行运算
首先带大家认识两个位运算符:>> 箭头朝右指,故右移运算符 << 箭头朝左指,故左移运算符
比如 5>>1 表示将5右移一位 --> 即 5的二进制 0 0 0 0 0 1 0 1 右移一位得 0 0 0 0 0 0 1 0 原本末尾的1被移走,高位补0;左移同理
注意:因右边是数据的最低位,所以当右移出去后,再左移是不能恢复到原来的数字的,但左移不同,左边剩下的高位都为0,都是存在的,当你的数
字不足够大时,左移之后是还可以通过右移恢复原数的
加下群 590750544 (群公告有大量学习资料和工具及教学视频)
当想使用位运算交换两个数的时,应先对每个数实际二进制位数做简单估测,再确定所移动位数,下面为交换两个数的实例
加下群 590750544 (群公告有大量学习资料和工具及教学视频)
注:上述代码中的&运算符运算原理和亦或相似,这个是如果两个都为1,则为1,否则为0;
当用此方法进行交换两个数时,一是两个 数的大小 比第三种方法还受限制,而且所移的位数不好确定,不推荐使用
学习编程(C语言/C++),并不难各位可以加下群 590750544 (群公告有大量学习资料和工具及教学视频),一起交流提升,编程不要觉得很难,虽说也有难度,但是学好了对以后的帮助是非常大。
我知道肯定毛病颇多,望各位大佬口下留情,手下留情,多多指点;谢过谢过
猜你喜欢
- 2024-10-18 了解C语言中的操作符(c语言操作符怎么定义)
- 2024-10-18 20天轻松入门《C++第二章——程序设计基础》—3经坛教育
- 2024-10-18 C++中的volatile关键字(volatile关键字 c语言)
- 2024-10-18 C/C++软件开发证书怎么考?报考难度大吗?含金量高吗?
- 2024-10-18 c++数据类型(c++数据类型转换)
- 2024-10-18 C语言中实现边沿函数算法及应用,这是抛弃PLC留下的痛!
- 2024-10-18 C基础、经典问题:交换a、b值较好的方法?
- 2024-10-18 C++ 避免使用模块重新编译模板库(调用c++模块,不忽略异常)
- 2024-10-18 面试大厂c/c++后台开发岗,如何从技术层面上杀出重围?
- 2024-10-18 记录有趣的面试题:二进制字符串相加,C++/Java/Python 解法分析
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)