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

原创 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是不能禁止回车响应的,但在程序逻辑上,你可以通过以下四个办法之一来避免回车的影响: 一、如...

网格Cache若干问题分析.pdf

  • 2014-09-20 14:39
  • 314KB
  • 下载

视频监控的若干问题

  • 2014-07-30 20:32
  • 2.34MB
  • 下载

Linux下配置vsftp的若干问题

# 530 Login incorrect. FTP中有一个名叫ftpusers的文件,该文件未在配置文件vsftpd.conf中指明。也就是说只要ftpusers这个文件存在,它就起作用,里面写的都...

51单片机若干问题

  • 2015-05-07 10:50
  • 117KB
  • 下载

用iframe进行表单提交时的若干问题总结

这篇文章主要用来探讨在使用iframe进行表单提交时一系列浏览器兼容性以及iframe本身的一些限制。 iframe的主要用途一般是运用在无刷新提交数据并做出响应的场景,可以作为ajax方式的有...

关于word的若干问题回答

  • 2012-05-19 21:51
  • 52KB
  • 下载

GPFS 对软硬件环境要求 若干问题

1.GPFS对主机的要求,如主机硬件配置     GPFS除需要使用HBA卡连接存储外,需要单独的网卡(最好两块)作为GPFS VLan管理 2.GPFS对共享存储的要求     GPFS支持的存...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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