疑问:交换两个数的若干问题

原创 2016年08月29日 19:07:18

涉及交换两个数的问题中,有三种解决方法:

A:利用第三变量temp

B:利用加减法,

A=A+B;

B=A-B;

A=A-B;

C:第三种是利用位^(异或运算符)运算,如

public static void main(String[] args) {
int a = 2;
int b = 4;

a = a ^ b;
b = a ^ b;
a = a ^ b;

System.out.println(a);
System.out.println(b);
}

第三种方法不明白为什么,所以我调试了下程序,


我们可以看到,经过了a=a^b;这步,a已经发生了变化,

a:0000 0000 0000 0010

^

b:0000 0000 0000 0100

=

a:0000 0000 0000 0110


所以结果就是6,再接下来

可以看到,b也发生了变化

a:0000 0000 0000 0110

^

b:0000 0000 0000 0100

=

b:0000 0000 0000 0010

上面的结果其实可以发现一些细节,其实是巧妙借用了异或运算进行变换,

那么问题来了,怎么个巧妙法?

第一步,它先用异或运算把两个值的不同点都拿出来,

第二步,再用异或运算把第一步的结果减去b,得出的就是a了吧,(即是b=a)


那么,这时就可以推断出第三步了,

第三步,第一步结果减去b(原来的a值),那么就是b.

a也再次发生变化

a:0000 0000 0000 0110

^

b:0000 0000 0000 0010

=

b:0000 0000 0000 0100


总结:从上面可以看出,其实就是相当于第二种方法了,

先把两个数加起来,然后减去第一个数,再减去第二个数。


为了验证我的总结,直接调试了下结果,


结果正确~


故此,两数交换的原理也掌握清楚。


15个数折半查找时候遇到的若干问题及解决

3.1本例题解决时发现不能用scanf()获得当前值,之前有printf()干扰了其获值  scanf的%c是不能禁止回车响应的,但在程序逻辑上,你可以通过以下四个办法之一来避免回车的影响: 一、如...

模糊控制工程应用若干问题研究

  • 2015年12月09日 13:21
  • 9.39MB
  • 下载

路灯配电系统若干问题的探讨

  • 2013年12月26日 14:46
  • 295KB
  • 下载

mongodb 数据导入导出若干问题

使用mongoexport.exe导出数据 , mongoimport.exe 导出数据 //导出 .json文件 D:\tool\mongo\bin\mongoexport --username...

MIMO雷达信号检测的若干问题研究

  • 2014年08月17日 13:00
  • 4.28MB
  • 下载

Linux +开发板若干问题

一:uboot下 tftp 下载内核 1.开发板和windows能够ping通 保证通过一个网段 windows防火墙关闭 2.windows和linux能够ping通   linux 防火墙关闭 /...
  • bbs375
  • bbs375
  • 2016年11月03日 16:29
  • 413

RFID射频若干问题研究

  • 2013年04月11日 14:13
  • 4.13MB
  • 下载

MFC对话框程序若干问题

  • 2011年03月23日 22:52
  • 167KB
  • 下载

C语言中结构体与指针的若干问题(在数据结构中的应用)

C语言中结构体与指针的若干问题(在数据结构中的应用)
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:疑问:交换两个数的若干问题
举报原因:
原因补充:

(最多只允许输入30个字)