C# 不借助第三个变量实现两整数交换
c#中实现两个int变量的数值互换,在借助第三个变量做临时载体的情况下,非常简单。
int a = ;
int b = ;
int c ;
c = a;
a = b;
b = c;
如果不借助第三方变量,有几种实现的方法:
1.异或算法(这种方法不借助第三个变量,也不会产生溢出,比较安全,但仅限整数类型)
int a = ;
int b = ;
a ^= b;
b ^= a;
a ^= b;
Console.WriteLine("{0} {1}", a, b);
2.直接赋值(有溢出的风险???(这里用Int32.MaxValue做测试,没有出现溢出,查看反编译的代码也不会出现溢出,不明白是不是不同的.net版本后台运算过程不一样))
a = a + b - (b = a);
或者(绝对不会出现溢出)
b = a + (a = b) * ;
直接赋值的方法理解了其中的原理,解决的方式可以有很多种,其中的+-*/可以做很多文章。
题外分析上面直接赋值的溢出风险:
贴上a=a+b-(b=a)的反编译代码,帮助理解:
IL_0006: ldloc.0 //加载索引为0的变量值10到栈顶端
IL_0007: ldloc.1 //加载5到栈顶端
IL_0008: add //提取10和5,执行add运算并将15推送到栈顶端
IL_0009: ldloc.0 //加载10到栈顶端
IL_000a: dup //复制10到栈顶端
IL_000b: stloc.1 //提取栈顶端值赋值给第1个变量
IL_000c: sub //提取当前栈顶端的10和15,做减法,讲5推送至栈顶
IL_000d: stloc.0 //提取栈顶端值赋值给第0个变量
这样来看,唯一有溢出风险的a+b那里,并没有将中间值赋给int类型的任何变量,这样溢出风险也就应该不存在了。
b=a+(a=b)*0;就不做反编译说明了,有兴趣的可以自己看一下,理解一下。
补充:对于有的评论说还可以用“a ^= b ^= a ^= b;”,这里我补充说明这个算式是不能实现互换的,起码.net 4.0的环境下是不行的。详细的另有扩展话题C#连等算式都在做什么。
C# 不借助第三个变量实现两整数交换的更多相关文章
- Java基础知识强化05:不借助第三个变量实现两个变量互换
1. 不借助第三个变量实现两个变量互换 代码如下: package himi.hebao; /** * 不借助第三个变量实现,两个变量互换 * 这里利用^异或实现两个变量的互换 * @author A ...
- 交换两个变量的值,不借助第三个变量的 三种方法(JS实现)
第一种:算术运算法 var a = 10; var b = 12; a = b - a; b = b - a; a = b + a; 它的原理是:把a.b看做数轴上的点,围绕两点间的距离来进行计算.具 ...
- PHP不借助第三个变量交换值
总结一下: //方法一: $a = "abc"; $b= "def"; $a = $a^$b; $b = $b^$a; $a = $a^$b; //方法二: l ...
- JAVA中两个int类型的变量在不借助第三个变量的情况下完成值的互换
在面试中被问到这个问题,想到两种解决方式,在此分享一下. 第一种,使用简单的数学运算达到目标(但是面试官往往会问你还有没有其他方式): public static void main(String[] ...
- python 交换变量的值 不需要借助第三个变量
>>> a,b,c,d=1,2,3,4>>> a,b,c,d=d,c,b,a>>> print(a,b,c,d)4 3 2 1>>&g ...
- php每天一题:怎么在不使用第三个变量的情况下交换两个变量的值
$a = 'php'; $b = 'my'; list($a,$b) = array($b,$a); echo $a,$b; 很简单,大家试一下是不是交换了!
- 【编程技巧】java不使用第三个变量处理两个变量的交换
public class SwapNum {public static void main(String[] args) {doSwapNum();}public static void doSwap ...
- Java实现两个变量的互换(不借助第3个变量)
创建一个类,在该类中定义两个变量并为其指定初始值,然后交换两个变量的值,要求不允许借助第三个变量,只能使用异或运行实现两个变量值的交换. import java.util.Scanner; publi ...
- 现在有两个变量,分别是a = 3, b = 4,那么我们不用第三个变量来调换a和b的值。
现在有两个变量,分别是a = 3, b = 4,那么我们不用第三个变量来调换a和b的值. <!DOCTYPE html><html><head> <me ...
随机推荐
- 带你开始进入NPM的世界之NPM包的开发
个人开发包的目录结构 ├── coverage //istanbul测试覆盖率生成的文件 ├── index.js //入口文件 ├── introduce.md //说明文件 ├── lib │ ...
- Yii2 使用 faker 生成假数据(转)
测试过程中有时候需要生成大量的假数据,faker 是一个生成假数据的类库,可以生成姓名,电话,IP地址,密码,ISBN等等你能想到的或者你想不到的各种类型的假数据. Yii2.0已经集成该类库,不用再 ...
- flowable学习笔记-简单流程概念介绍
1 Flowable process engine允许我们创建ProcessEngine 对象和使用 Flowable 的API ProcessEngine是线程安全的,他是通过 ProcessEng ...
- python 动态属性
先来看一下一个常见的Python类的定义: class Person(object): name = None age = None def __init__(self,name,age): self ...
- 关于haproxy多域名证书的配置
frontend main bind *: bind *: ssl crt /etc/haproxy/kong.com.pem crt /etc/haproxy/51yijI.com.pem no-s ...
- Golang IO包的妙用
Golang 标准库对 IO 的抽象非常精巧,各个组件可以随意组合,可以作为接口设计的典范.这篇文章结合一个实际的例子来和大家分享一下. 背景 以一个RPC的协议包来说,每个包有如下结构 type P ...
- android---笔记 AppContext extends Application
package com.fuda; import org.apache.http.client.CookieStore; import com.fuda.model.StudentInfoModel; ...
- Flink 中的kafka何时commit?
https://ci.apache.org/projects/flink/flink-docs-release-1.6/internals/stream_checkpointing.html @Ove ...
- 光照渲染[Unity]
http://www.unitymanual.com/m/Manual/RenderingPaths.html http://wenku.baidu.com/view/54eca9e09b896802 ...
- 【Android】安卓闪电复习
Intent An intent is an abstract description of an operation to be performed 一个Intent就是一次对将要执行的操作的抽象描 ...