`
jianchen
  • 浏览: 334089 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java基础复习(7)--值传递和交换变量值(异或)

阅读更多

对于java中的方法参数传递是传值方式,最典型的是,java中无法实现交换两个数值的方法,但C#和C++可以。C++总所周知是通过指针可以直接访问实参。而C#使用ByRef声明就可以实现。

不利用自己提供的临时变量,两个数交换:
方法一:
a = a+b;
b = a-b;
a = a-b;
但是这样需要考虑到a+b溢出的问题。
还有可以利用异或运算实现。

方法二:
void swap(int &a,int &b)
{
      a^=b;
     b^=a;
     a^=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


今 天开始讲解Eclipse的使用了。netbeans和eclipse都使用过,eclipse感觉用起来有些卡,以前用MyEclipse写web应用 程序,每次request.getParameter()方法时,都会卡住,等好久才恢复。Eclipse的支持很多,和很多开发工具集成起来,现在感觉 一个集成开发环境的功能太强大了,不只是以前的仅仅编译,调试,运行,而是一个真正的整合平台,比如代码提示,项目构建工具的集成,单元测试工具,版本控 制工具,数据库访问支持,性能调优,逆向工程,UML建模辅助等。很多东西都是拖拖控件就可以整出个界面,显著提高了开发效率。现在做eclipse的插 件开发的人也很多哈。不断地加入新的支持导致IDE越来越强大。netbeans出来的晚了些,不然风头应该会盖过eclipse。可惜sun公司一开始 没重视这一块,让IBM风光了一把。但我目前还是用Eclipse比较多,是习惯问题,netBeans有时很多功能找不到,就懒得用了。

提到了Borland公司,听到这个名字很是如雷贯耳哈。该公司开发出了很多流行的集成开发工具,如
编写c语言调试的Tubor C,还有JBuilder,不过因为诸多原因,现在早已分光不再,已经成为一个传奇。
由此可见,IT行业的新旧交替是非常快的,没有一个公司敢裹足不前,靠吃老本过日子。只有不断的自我创新,有所突破,向竞争对手学习,抢占先机,吸引用户群才是王道。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics