`

学习计算机底层知识:“反转”思考方式

阅读更多
一、高层知识点
        JDK集合框架中有一个接口:Comparator,其中有个compare()方法,方法签名需要传递两个参数,暂且就声明为arg1和arg2,用来互相比较两个参数的大小,该方法返回一个int类型的值,该结果有以下三种:
        1.负数:arg1比arg2小。
        2.零:arg1与arg2相等。
        3.整数:arg1比arg2大。
        通过观察上述三种结果,我想到了用减法运算来实现这个方法。
再来看另外一个知识点,String类 。其中有一个方法为compareTo(),方法签名需要传递一个String类参数,当前String对象与这个参数进行大小比较;观察其源码,是通过逐个字符做减法运算进行比较的,也是返回int类型的值(负数、零、整数)用以判断String大小的。
我在没学汇编语言的时候,我只是认为Java的实现机制是这样的,对于底层机制是如何实现的,或者说底层的比较机制是不是这样的没有一丝概念。
二、底层知识点
        介绍了这两个高层知识点后,再来介绍下与之相呼应的底层知识点。前些日子在学汇编语言的时候,学到了一个cmp指令,这里引用其原文(《汇编语言第二版》):
引用

        cmp指令是比较指令,cmp的功能相当于减法指令,只是不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较的结果。
        cmp指令格式: 操作对象1,操作对象2
功能:计算操作对象1-操作对象2,但并不保存结果,仅仅根据计算结果对标志寄存器进行设置。

        针对cmp指令,其相关的标志寄存器有两个比较重要的标志位:ZF和CF。
        ZF是零标志位,相关指令执行后,其结果是否为0。如果结果为0那么ZF=1;如果结果不为0,那么ZF=0。
        CF是进位标志位,该标志位记录了运算结果的最高有效位向更高位的进位值,或从更高位借位值。
        结合开头讲述的两个高层知识点来说,用汇编语言来说明:
        cmp arg1,arg2
        如果arg1 = arg2,则CF=0,ZF=1
        如果arg1 ≠ arg2, 则CF=0,ZF=0
        如果arg1 > arg2,则CF=0,ZF=0
        如果arg1 ≥ arg2,则CF=0,(ZF有可能为0也有可能为1)
        如果arg1 < arg2,则CF=1,ZF=0
        如果arg1 ≤ arg2,则CF=1,(ZF有可能为0也有可能为1)

        Java中的比较原理和汇编语言的比较原理上基本上是一致的。我不太确定这是不是巧合,又或许是Java语言就是按照底层的这种机制来实现的。不过这个疑问不会对学习底层知识有任何的影响,任它高级语言变化来变化去,底层还是那亘古不变的机制。

三、总结
        知识网是由N多线连接成的,而线又由两个点连接起来的。知识点不应该是被孤立的,它应该是和其它知识点相交的、相通的、相融的。
        这篇博文中讲述的几个例子并不是很深入,其实主要是想阐述怎样使用“反转”的思考方式去学习底层知识,而不是说单单去学习底层知识,知识是要被应用的,而不是学习过后记在脑子里不用。
        用高层知识去学习底层知识,其实就是一种本末倒置的手法。还是用以往先从底层知识学起,再逐步学习高层知识,对我个人来说起到的效果不是很明显;反过来用“反转”的思考方式,带着对高层知识的疑问去学习底层知识,会起到意想不到的效果。换句话来说就是通过高层知识来去学习底层知识,然后再用底层知识来理解它是怎么被高层知识应用的(控制反转思想?)。



1
1
分享到:
评论
3 楼 jdftkti 2010-12-29  
受益匪浅。
2 楼 深夜未眠 2010-12-20  
zhangcong170 写道
很不错  前阵子正好用到了Comparator,compare()方法的实现确实可以按照你的方式改进一下  多想想底层的实现

感谢的你鼓励~~~
1 楼 zhangcong170 2010-12-17  
很不错  前阵子正好用到了Comparator,compare()方法的实现确实可以按照你的方式改进一下  多想想底层的实现

相关推荐

Global site tag (gtag.js) - Google Analytics