不使用中间变量交换两个数值型变量的值

VC Spyglass调试秘籍:从Lint报错到代码修复的完整工作流 本文详细介绍了VC Spyglass调试的完整工作流,重点解析了如何高效定位和修复Lint检查中常见的XMRE-L跨模块引用错误。通过对比GUI与命令行(vc_static_shell)双模式调试技巧,并结合TCL脚本实现批量处理与规则豁免,帮助数字设计工程师系统化地提升代码调试效率与质量。 阅读详情

  记得第一次接触“不使用中间变量交换两个数值型变量的值”这个概念是在学习算法的时候,课本后有这样一道课后题,当时想到的方法就是现在所说的加减法。后来在编程和学习的过程中又发现了几种方法,特写此帖,总结一下。这里所写的语言环境是C/C++语言,一些运算符的形式以及可以内嵌汇编代码的约束都是类C的。

 

  第一类方法也是常用的方法,通过多次的数值计算来完成交换,到现在知道的有下面三种:

 

  (1)加减法。

     a = a + b;

     b = a - b;

     a = a - b;

  该方法可以交换整型和浮点型数值的变量,但在处理浮点型的时候有可能出现精度的损失,例如对数据:

     a = 3.123456

     b = 1234567.000000

  交换后各变量值变为:

     a = 1234567.000000

     b = 3.125000

  很明显,原来a的值在交换给b的过程中发生了精度损失。

 

  (2)乘除法。

     a = a * b;

     b = a / b;

     a = a / b;

  乘除法更像是加减法向乘除运算的映射,它与加减法类似:可以处理整型和浮点型变量,但在处理浮点型变量时也存在精度损失问题。而且乘除法比加减法要多一条约束:b必不为0。

  可能经验上的某种直觉告诉我们:加减法和乘除法可能会溢出,而且乘除的溢出会特别严重。其实不然,采用这两种方法都不会溢出。以加减法为例,第一步的加运算可能会造成溢出,但它所造成的溢出会在后边的减运算中被溢出回来。

 

  (3)异或法。

     a ^= b;

     b ^= a;

     a ^= b;

  异或法可以完成对整型变量的交换,对于浮点型变量它无法完成交换。

 

  第二类方法更像是玩了一个文字游戏,此种方法采用了在代码中嵌入汇编代码的方法避免了临时变量的引入,但究其本质还是会使用额外的存储空间。此种方法可以有很多种,下边列出几种:

 

  (1)使用xchg指令,这也是比较直观、容易想到的方法,因为xchg指令的功能就是交换源操作数和目的操作数的值,这里要使用额外寄存器来暂存变量。内嵌汇编代码如下:

     _asm

     {

         mov eax,a

         xchg b,eax

         mov a,eax

     }

 

  (2)使用额外的栈。这里使用反向的出栈顺序来完成交换。内嵌代码有如下两种形式:

     _asm

     {

         push a

         push b

         pop a

         pop b

     }

  另一种形式:

     _asm push a

     a = b;

     _asm pop a

 

  (3)使用mov指令。这种方法使用额外寄存器来暂存一个变量的值。

     _asm mov eax,a

     a = b;

     _asm mov b,eax

 

  其实第二类方法并不合格,它虽然没有显式的使用临时变量,但还是会用到额外的存贮空间。不过也不能说没有必要掌握,从实用的角度看还是很“有用”的。不是有公司出过这样的面试题吗?“不使用加减法和异或法完成不使用中间变量交换两个数值型变量的值”。此时或许只好使用这种方法了。

Lumerical 教程,包含作者个人理解及相关设计案例 (目前共计184篇,持续更新中) 4138。 阅读详情

相关推荐

【毕业设计参考】基于yolov8+pyqt5自适应界面设计的锂电池表面缺陷检测系统

基于YOLOv8+PyQt5的锂电池表面缺陷检测系统结合了先进的目标检测技术与友好的用户界面设计,为锂电池质量检测提供了一种高效、准确的解决方案。未来,随着深度学习技术的不断发展,我们可以进一步优化模型,提高检测精度和速度,同时拓展系统功能,如实现实时视频流检测、与生产系统的深度集成等,为锂电池产业的发展注入新的活力。希望本文对大家在相关领域的研究和实践有所帮助,欢迎大家在评论区交流讨论。

1182

交换两数(不使用中间变量)

交换两数,其中没有用到临时变量,并且表明了每种方法的缺点,希望大家在使用的时候选择最合适的方法

weixin_72883322的博客 2359

STM32CubeMx + FatFs 实战:SD卡DMA传输中断回调问题深度解析

本文深度解析了在STM32CubeMx环境下,结合FatFs文件系统并使用DMA进行SD卡读写时,程序可能出现的“卡死”问题。核心原因在于HAL库的弱函数回调机制未被正确处理,导致DMA传输完成中断后,状态机锁死。文章提供了两种实战修复方案:直接修改HAL库文件或在用户代码中重写回调函数,并给出了关键的配置检查点与调试技巧,帮助开发者彻底解决SD卡DMA传输中断回调失效的难题。

weixin_29176179的博客 330

【技巧】不使用中间变量交换两个变量的值

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34007886的博客 520

基于知识图谱的电影推荐系统——Neo4j&Python

也可直接从这里下载:链接: https://pan.baidu.com/s/1l6wjwcUzy5G_dIlVDbCkpw 提取码: pkq6。修改main.py中的driver,输入自己数据库的用户名与密码。系统会询问是否需要重新加载并创建知识图谱,在第一次时输入1。

weixin_46351593的博客 6355

别再只用CANape测数据了!手把手教你用ASAP2 Studio编辑A2L文件(附MAP文件更新避坑指南)

本文深入探讨ASAP2 Studio在ECU开发中的高阶应用,特别是如何利用其编辑A2L文件并同步更新MAP文件,提升测量标定效率。文章详细解析了ASAP2 Studio的双向同步能力、MAP文件更新全流程及变量管理技巧,帮助工程师避免常见错误,优化工作流程。

weixin_26833939的博客 507

不使用中间变量交换两个变量的值详解

想了解更多算法题,可以关注微信公众号“数据结构和算法”,每天一题为你精彩解答。 交换两个int类型数字的值,最简单的方式就是使用一个临时变量 1 public static void swap1(int[] A, int i, int j) { 2 int temp = A[i]; 3 A[i] = A[j]; 4 A[j] = temp; 5 } 如果不使用临时变量,我...

数据结构和算法 2302

如何用 OBProxy 实现 OceanBase 的最佳路由策略

本文基于业务中一类常见的路由问题展开,对OceanBase的路由功能及对应配置项做详细介绍,指导用户在业务实践中如何正确的配置路由策略及快速排查路由问题

OceanBase分布式数据库的博客 1679

不用中间变量交换两个数的值

不用中间变量,交换变量

Zwarwolf的专栏 7850

TensorRT量化校准数据集选择

在TensorRT中进行INT8量化时,校准数据集的选择至关重要,直接影响量化后模型的精度和推理性能。这是一个典型的问题。

浩瀚之水的专栏 497

多模态大模型在AI人工智能领域的创新实践探索

随着人工智能技术的飞速发展,单一模态的数据处理已经难以满足复杂现实场景的需求。多模态大模型通过融合多种模态的数据,如文本、图像、音频等,能够更全面、深入地理解和处理信息,为人工智能的发展带来了新的机遇和挑战。本文的目的在于深入探讨多模态大模型在AI人工智能领域的创新实践,包括其核心概念、算法原理、实际应用等方面,旨在为相关领域的研究人员和从业者提供全面的技术参考和实践指导。本文的范围涵盖了多模态大模型的基本原理、算法实现、数学模型、项目实战以及实际应用场景等多个方面。

大模型应用工坊 1316

不用中间变量,a和b怎样互换?

1、加减法:该方法可以交换整型和浮点型数值的变量,但在处理浮点型的时候有可能出现精度的损失 a = a + b; b = a - b; a = a - b; 2、异或法:可以完成对整型变量的交换,对于浮点型变量它无法完成交换。 a = a^b; b = a^b; a = a^b; 3、乘除法:可以处理整型和浮点型变量,但在处理浮点型变量时也存在精度损

shanchangyi的博客 784

拉曼光谱入门:7.拉曼光谱仪光学系统结构详解

本文系统拆解了拉曼光谱仪从激光器输出经聚焦照明、二向色镜/陷波滤光片组滤除瑞丽散射、衍射光栅色散至CCD探测的完整光路,阐述了各光学模块在微弱非弹性散射信号提取、杂散光抑制及高分辨光谱成像中的工程原理与技术参数要求。

qq_53529450的博客 223

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

不适用中间变量交换两个数值型变量的值

不使用中间变量交换两个数值型变量的值 第一类方法也是常用的方法,通过多次的数值计算来完成交换,到现在知道的有下面三种:   (1)加减法。      a = a + b;      b = a - b;      a = a - b;   该方法可以交换整型和浮点型数

dreamtwoo4的专栏 613

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

两个数值型变量交换值的方法总结

方式一: 可读性强,适用于全部变量,但是会申请一个空闲的空间在大体量的程序中会造成空间大量的浪费。 public class Test{ public static void main(String[] args){ int a=1; int b=2; ...

354

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

交换两个变量的值的三种方法

方法一:定义临时变量法 运用此方法比较简单 public class 定义临时变量 { public static void main(String[] args) { int v1=1; int v2=2; System.out.println("v1="+v1+","+"v2="+v2); int temp;//定义临时变量 temp=v1;//实现交换 v1=v2; v2=temp

weixin_46569912的博客 5903

两个数在不使用中间变量的情况下,交换数值的方法汇总.

第一类方法也是常用的方法,通过多次的数值计算来完成交换,到现在知道的有下面三种: (1)加减法。 a = a + b; b = a - b; a = a - b; 该方法可以交换整型和浮点型数值的变量,但在处理浮点型的时候有可能出现精度的损失,例如对数据: a = 3.123456 b = 1234567.000000 交换后各变量值变为: a = 1234567.000000

woshixiaoge6410的专栏 984

不使用第三个变量,交换A、B变量值

不使用第三个变量,交换A、B变量值总结如下: 1.数值型变量 int a, b a = a+b b = a - b a = a – b  2.字符串变量 string a, b a=/abc/ b=/xyz/ a = a + b b = mid(a, 0,Len(a)-Len(b)) a = mid(a,len(b)+1,len(a)-len(b

michaelrun的专栏 1410

不利用临时变量,交换两个变量的值

1.借助中间量交换 通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换。代码如下: int x = 10; int y = 20; int temp = x; x = y; y = temp; 这种算法易于理解,特别适合帮助初学者了解计算机程序的特点,是赋值语句的经典应用。在实际软件开发当中,此算法简单明了,不会产生歧义,便于程序员之间的交流,一般情况下碰到交...

Illina的专栏 610

不使用中间变量交换两个数值变量的值

第一类方法也是常用的方法,通过多次的数值计算来完成交换,到现在知道的有下面三种:(1)加减法。 a = a + b; b = a - b; a = a - b; 该方法可以交换整型和浮点型数值的变量,但在处理浮点型的时候有可能出现精度的损失,例如对数据: a = 3.123456 b = 1234567.000000 交换后各变量值变为: a = 1234567.000000 b = 3.12500

Jason763的博客 868

不使用第三个变量,交换两个变量的值

1) 算术运算 int a,b; a=10;b=12; a=b-a; //a=2;b=12 b=b-a; //a=2;b=10 a=b+a; //a=10;b=10 它的原理是:把a、b看做数轴上的点,围绕两点间的距离来进行计算。 具体过程:第一句“a=b-a”求出ab两点的距离,并且将其保存在a中;第二句“b=b-a”求出a到原点的距离(b到原点的距离与ab两点距离之差),并且将其

透明大脑 1562

交换两个变量数值的方法

方式一 public static void main(String[] args) { int x = 10, y = 20; //定义两个变量 System.out.println("交换前 x=" + x + ",y=" + y); int temp = x; x = y; y = temp; System.out.println("交换前 x...

Helele_Blog的专栏 346

变量交换

1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title></title> 6 </head> 7 <body> 8 <script&g...

aizishen7742的博客 79

windows第十章 数值型关联变量和控件型关联变量

DoDataExchange的作用是进行数据交换和验证,不需要手动调用,也不能手动调用,是由UpdateData调用的。上例OnInitDialog后也会调用,说明OnInitDialog应该是调用了UpdateData(FALSE)然后把radioButton减少到2个,第一个加了组长,才能用的BOOL,而且。radioButton,我使用BOOL类型会弹出错误提示,而用int就没限制。有些数值型关联变量要特定的类型,否则会报错。当我输入的数据不在范围内,就会出提示。可以看到类别选项是灰色的,点不开。

yerennuo的博客 845

不用临时变量怎么交换两个变量的值?

作者:iamlaosong 编程中有时会碰到要交换两个变量的值,就是将变量x的值给变量y,变量y的值给变量x,最常见的办法就是设一个临时变量t担任桥梁,即: t=x; x=y; y=t; 对于数值型变量,还有一个更巧妙的办法,不用增加临时变量,方法如下: x=x+y; y=x-y; x=x-y; 这样看似乎不直观(看不到变量值的变化),我们用下面的方式表示(变量值发生变化时,用新的符号表示,以示区别),并加上注释,就一目了然了: x"=x+...

驽马十驾 才定不舍 396
上一篇: 国人的浮躁!
下一篇: gcc/g++参数详解
AlwaysSLH
博客等级 码龄20年 63粉丝 17原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值