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

[b]一、高层知识点[/b]
JDK集合框架中有一个接口:Comparator,其中有个compare()方法,方法签名需要传递两个参数,暂且就声明为arg1和arg2,用来互相比较两个参数的大小,该方法返回一个int类型的值,该结果有以下三种:
1.负数:arg1比arg2小。
2.零:arg1与arg2相等。
3.整数:arg1比arg2大。
通过观察上述三种结果,我想到了用减法运算来实现这个方法。
再来看另外一个知识点,String类 。其中有一个方法为compareTo(),方法签名需要传递一个String类参数,当前String对象与这个参数进行大小比较;观察其源码,是通过逐个字符做减法运算进行比较的,也是返回int类型的值(负数、零、整数)用以判断String大小的。
我在没学汇编语言的时候,我只是认为Java的实现机制是这样的,对于底层机制是如何实现的,或者说底层的比较机制是不是这样的没有一丝概念。
[b]二、底层知识点[/b]
介绍了这两个高层知识点后,再来介绍下与之相呼应的底层知识点。前些日子在学汇编语言的时候,学到了一个cmp指令,这里引用其原文(《汇编语言第二版》):
[quote]
cmp指令是比较指令,cmp的功能相当于减法指令,只是不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较的结果。
cmp指令格式: 操作对象1,操作对象2
功能:计算操作对象1-操作对象2,但并不保存结果,仅仅根据计算结果对标志寄存器进行设置。
[/quote]
针对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语言就是按照底层的这种机制来实现的。不过这个疑问不会对学习底层知识有任何的影响,任它高级语言变化来变化去,底层还是那亘古不变的机制。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值