一般实现两个变量之间的互换要用第三个变量,这样做可以,但创建新变量,增加了系统开销。如果要交换的变量时两个整数型变量,可以用更高效的方法。例如:^(异或)操作,举例如下:

package chapterOne;
import java.util.Scanner; public class VariableExchange { public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
System.out.println("Please enter first variable A:");
long A=scan.nextLong();
System.out.println("Please enter second variable B:");
long B=scan.nextLong();
System.out.println("A="+A+"\tB="+B);
System.out.println("Implementation of variable swap");
A=A^B;
System.out.println("A="+A+"\tB="+B);
B=B^A;
System.out.println("A="+A+"\tB="+B);
A=A^B;
System.out.println("A="+A+"\tB="+B);
} }

原理理解如下:

a-------------------------b
a^=b    a^b-----------------------b
b^=a    a^b-------b^(a^b) => a
a^=b    a^b^(a) => b-----------a

OK           b-------------------------a

要知道,a^b=c  =>  a^c=b;a^c=b;

即只要直到a,b,c中的任意两个,即可利用异或运算退出另外一个数。

RAID里面就用到了这技术。三个里面知道任意两个就可以恢复第三个,磁盘位的恢复的一种手段。

数学上的原理如下:

^ 在 C 里面是按位异或操作符。异或运算的原理应该清楚吧?相同的话异或的结果就是 0,不同的话就是 1。举个例子,比如 a 表示十进制的 5,b 表示十进制的 12,按位异或结果就是:

a = 0101   (5 的二进制表示)
b = 1100   (12 的二进制表示)
    ----
c = 1001   (结果为 9)

有两个定理:
任何一位二进制数同 1 异或都会变成另外一个(0 同 1 异或的结果是 1,1 同 1 异或的结果是 0)
任何一位二进制数同 0 异或都保持不变(0 同 0 异或的结果是 0,1 同 0 异或的结果是 1)

因为 c 中是 1 的部分表示 a 和 b 中按位不同的位,0 表示 a 和 b 中按位相同的位,那么 a 同 c 异或的结果就是 a 中与 b 不同的位发生变化,二进制数每位只有两种状态,所以 a 变成了 b:

a = 0101
c = 1001
    ----
b = 1100

同样, b 与 c 异或结果就变成了 a:

b = 1100
c = 1001
    ----
a = 0101

java 中利用异或实现两个变量互换的更多相关文章

  1. Java基础知识强化05:不借助第三个变量实现两个变量互换

    1. 不借助第三个变量实现两个变量互换 代码如下: package himi.hebao; /** * 不借助第三个变量实现,两个变量互换 * 这里利用^异或实现两个变量的互换 * @author A ...

  2. Java中的ReentrantLock和synchronized两种锁定机制的对比

    问题:多个访问线程将需要写入到文件中的数据先保存到一个队列里面,然后由专门的 写出线程负责从队列中取出数据并写入到文件中. http://blog.csdn.net/top_code/article/ ...

  3. 在JAVA中利用public static final的组合方式对常量进行标识

    在JAVA中利用public static final的组合方式对常量进行标识(固定格式). 对于在构造方法中利用final进行赋值的时候,此时在构造之前系统设置的默认值相对于构造方法失效. 常量(这 ...

  4. Java中利用随机数的猜拳游戏

    Java中利用随机数的猜拳游戏,实现非常简单,重难点在于随机数的产生. 首先GameJude类是用于判断输赢的一个类: package testGame; public class GameJudge ...

  5. java 中利用反射机制获取和设置实体类的属性值

    摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...

  6. python中如何调用函数交换两个变量的值

    python中如何调用函数交换两个变量的值 所有代码来在python3.7.1版本实现 以下实例通过用户输入两个变量,并相互交换:  方法一: def swap(a,b): # 创建临时变量,并交换 ...

  7. ThinkPHP3.2中if判断条件是两个变量

    <select name="typeId"> <foreach name="typeInfo" item="v"> ...

  8. vue中利用.env文件存储全局环境变量,以及配置vue启动和打包命令

    目录 1,前言 2,.env文件的作用 3,配置.env文件 4,配置启动命令 5,获取.env中的全局变量 5,实际用处 1,前言 分享一下vue项目中利用.env文件存储全局环境变量,以及利于项目 ...

  9. Java中的异或(转)

    在java程序里面的异或用法: 相同输出0,不同输出1,例如: System.out.println(1^1); 输出0 System.out.println(1^2):输出3,因为最后2个低位都不一 ...

随机推荐

  1. 使用 jQuery 进行前端验证

    前段验证脚本的教程,其基础为jQuery的插件validate.    一.可以验证哪些信息 要求输入不能为空 要求输入格式必须为电子邮箱 要求输入格式必须为URL 要求输入格式必须为日期 要求输入格 ...

  2. MySQL Crash Course #09# Chapter 17. Combining Queries: UNION

    INDEX UNION Rules WHERE VS. UNION UNION VS. UNION ALL Sorting Combined Query Results UNION Rules As ...

  3. Python之os.path路径模块中的操作方法总结

    #os.path模块主要集成了针对路径文件夹的操作功能,这里我们就来看一下Python中的os.path路径模块中的操作方法总结,需要的朋友可以参考下 解析路径路径解析依赖与os中定义的一些变量: o ...

  4. Java项目导出为jar包+导出第三方jar包+使用命令行调用+传参

    Java项目导出为jar包+导出第三方jar包+使用命令行调用+传参 一.打包 情况1:不需要向程序传参数,并且程序没有使用第三方jar包 Eclipse上导出jar: 然后选择一个java文件作为入 ...

  5. 20145335郝昊《网络攻防》Exp4 MS11_050

    20145335郝昊<网络攻防>Exp4 MS11_050 实验内容 初步掌握平台matesploit的使用 了解漏洞MS11_050漏洞:use-after-free漏洞,即对象被释放之 ...

  6. 实验二 Java 面向对象程序设计

    实验内容 1 初步掌握单元测试和TDD 2 理解并掌握面向对象三要素:封面,继承,多态 3 初步掌握UML建模 4 熟悉SOLID原则 5 了解设计模式 (一)单元测试 D

  7. bzoj 3343: 教主的魔法

    Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 924  Solved: 402[Submit][Status][Discuss] Descriptio ...

  8. 不到 200 行代码,教你如何用 Keras 搭建生成对抗网络(GAN)【转】

    本文转载自:https://www.leiphone.com/news/201703/Y5vnDSV9uIJIQzQm.html 生成对抗网络(Generative Adversarial Netwo ...

  9. HDU 4135 Co-prime(容斥:二进制解法)题解

    题意:给出[a,b]区间内与n互质的个数 思路:如果n比较小,我们可以用欧拉函数解决,但是n有1e9.要求区间内互质,我们可以先求前缀内互质个数,即[1,b]内与n互质,求互质,可以转化为求不互质,也 ...

  10. BZOJ2654: tree 二分答案+最小生成树

    Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...