读取寄存器值_C 关于使用异或运算交换两数的值

本文探讨了使用C语言中异或运算与临时变量法交换两数的值,指出异或运算虽然可以实现交换但不推荐,因为它涉及更多内存写入操作且可读性较差。通过gcc编译器编译并查看汇编代码,发现临时变量法编译后的代码行数更少,效率更高。同时提到了使用加减法交换的另一种方式,同样需要三次内存写入操作。文章附有三种方法的汇编代码对比图。
摘要由CSDN通过智能技术生成
97e3eafbf784c26c665ce83ae34f3e88.png

点击关注了解更多精彩内容!!

异或运算可以达到交换两数的目的,代码如下:

3f94d2a19cb79bcc4dc892d45a2658fa.png

但不推荐使用这种方式,附上常用的临时变量方法对比说明。

临时变量方法:

38c76ad46d0faae846b9f2a930311585.png

对于临时变量法,每次赋值只要读取一个变量的值到寄存器,然后再从寄存器写回到另一个变量中即可,前后涉及两次内存写入操作;但是对于异或运算操作,每次都需要读取两个数据到寄存器中,再进行运算操作,之后把结果写回到变量中,前后共需要三次内存写入操作。另外一点,异或操作的代码可读性差。

如果使用C语言实现上述两种方法,并用gcc编译器编译,可以使用命令 gcc -S swap.c 查看相应的汇编代码,临时变量法代码行数更少,另外使用 gcc 编译器时,用异或运算交换数组会出错,参见链接。

在不引入临时变量的基础上,交换两数的值还可以使用三次加减法,代码如下:

570a2ea97998265b2b169cc457d160fa.png

这种方式同样需要三次内存写入操作,同时代码可读性也较差。

最后附上两张三种方法编译后对应汇编代码对比图(平台:Ubuntu14.04,gcc 4.8.4),图中 swap1.c 文件对应临时变量法,swap2.c 文件对应加减方法,swap3.c 文件对应异或方法。可以看到,临时变量法编译出的汇编代码量最少即效率更高,加减法和异或方法的区别仅仅是计算方式不同而已,操作步骤是一致的。

图1: 临时变量法和加减法汇编代码对比

a2834861958ae88311c76904cfc19b68.png

图2: 异或方法和加减法汇编代码对比

6b4849ce5d3dd2a7370a9b90e9faada3.png

2b053377ae7b9b0a0f1f908947a532a0.png

Dotcpp题解接受大家发表各大OJ的题解
重点用户还会有礼品相送~
欢迎搜索c语言网

https://www.dotcpp.com/

f1527653e4753025d1e3a8898f323969.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值