Fly With My Heart

誓言无声,人生无悔。

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  54 随笔 :: 2 文章 :: 6 评论 :: 0 引用

公告

2008年4月12日 #

(一)进位计数制的基本概念
  将数字符号按序排列成数位,并遵照某种由低位到高位进位的方法进行计数,来表示数值的方式,称作进位计数制。比如,我们常用的是十进位计数制,简称十进制;就是按照“逢十进一”的原则进行计数的。
  进位计数制的表示主要包含三个基本要素:数位、基数和位权。数位是指数码在一个数中所处的位置;基数是指在某种进位计数制中,每个数位上所能使用的数码的个数,例如十进位计数制中,每个数位上可以使用的数码为0、1、2、3…9十个数码,即其基数为10;位权是指一个固定值,是指在某种进位计数制中,每个数位上的数码所代表的数值的大小,等于在这个数位上的数码乘上一个固定的数值,这个固定的数值就是这种进位计数制中该数位上的位权。数码所处的位置不同,代表数的大小也不同。例如在十进位计数制中,小数点左边第一位位权为 100,左边第二位位权为 101;左边第三位位权为102;…。 小数点右边第一位位权为10-1;小数点右边第二位位权为10-2;…以次类推。
1.十进制
  十进位计数制简称十进制;有十个不同的数码符号:0、1、2、3、4、5、6、7、8、9。每个数码符号根据它在这个数中所处的位置(数位),按“逢十进一”来决定其实际数值,即各数位的位权是以10为底的幂次方。
  例如:(215.48)10 = 2×102+1×101+5×10 0+4×10-1+8×10-2
2.二进制
  二进位计数制简称二进制;有二个不同的数码符号:0、1。每个数码符号根据它在这个数中所处的位置(数位),按“逢二进一”来决定其实际数值,即各数位的位权是以2为底的幂次方。
  例如:(11001. 01)2 = 1×24+1×23+0×22+0×21+1×20+0×2-1+1×2-2 = (25.25)10
3.八进制
  八进位计数制简称八进制;有八个不同的数码符号:0、1、2、3、4、5、6、7。每个数码符号根据它在这个数中所处的位置(数位),按“逢八进一”来决定其实际数值,即各数位的位权是以8为底的幂次方。
  例如:(162.4)8 = 1×82+6×81+2×80+4×8-1 = (114.5)10
4.十六进制
  十六进位计数制简称十六进制;有十六个不同的数码符号:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。每个数码符号根据它在这个数中所处的位置(数位),按“逢十六进一”来决定其实际数值,即各数位的位权是以16为底的幂次方。
  例如:(2BC.48)16 = 2×162+B×161+C×160+4×16-1+8×16-2 = (700.28125)10
  总结以上四种进位计数制,可以将它们的特点概括为每一种计数制都有一个固定的基数,每一个数位可取基数中的不同数值;每一种计数制都有自己的位权,并且遵循“逢基数进一”的原则。 
(二)进位计数制之间的转换
1、二进制转换到十进制简易方法:(10110101)2此数从低位到高位分别在对应数字下写上:2021222324252627对(1 2 4 8 16 32 64 128)对应相乘后相加(红色数字相加)得:(181)10   
2.不同进位计数制之间的转换,实质是基数转换。一般转换的原则是:如果两个有理数相等,则两个数的整数部分和小数部分一定分别相等。因此,数制之间进行转换时,通常对整数部分和小数部分分别进行转换。
 1.非十进制数(N 进制数)转换为十进制数  方法:将各个N进制数按权展开求和即可。
  例如:
  (10110.11)2 = 1×24+0×23+1×22+1×21+0×20+1×2-1+1×2-2=(22.75)10
  (125.24)8 = 1×82+2×81+5×8 0+2×8-1+4×8-2=(85.3125)10
  (3A8.48)16 = 3×162+A×161+8×160+4×16-1+8×16-2=(936.28125)10
 2.十进制数转换为非十进制数(N进制数)  方法:整数部分采取“除基数取余法”,小数部分采取“乘基数取整法”。
  1)十进制转换为二进制数  方法:整数部分采取“除2取余法”,小数部分采取“乘2取整法”。
  例如:将十进制(123.75) 10转换为二进制数
整数部分123转换如下:
        余数.小数点
2 123      1   整数低位
2  61      1
2  30      0
2  15      1
2   7      1
2   3      1
2   1      1
    0      1   整数高位
小数部分0.75转换如下:
    小数点.整数    0.75
          |       *   2
小数首位  | 1      1.50
          |        0.50
          |       *   2
小数末位  | 1      1.00
                     00——为零,转换结束
(123.75)10 = (1111011.11)2
2)十进制转换为八进制数
方法:整数部分采取“除8取余法”,小数部分采取“乘8取整法”。
例如:将十进制(123.75) 10转换为八进制数
             余数.小数点
8 | 123          |  整数低位
8 |  15        3 |
8 |   1        7 |
      0        1 |  整数高位
小数点.整数       0.75
      |        *     8
      |  6        6.00
      |             00——为零,转换结束
(123.75)10 = (173.6)8
3)     十进制转换为十六进制数  方法:整数部分采取“除16取余法”,小数部分采取“乘16取整法”。
例如:将十进制(123.75) 10转换为16进制数
              余数.小数点
16 | 123          |  整数低位
16 |  7         B |
       0        7 |  整数高位
小数点.整数       0.75
      |        *    16
      |  C        12.0
      |              0——为零,转换结束
(123.75)10 = (7B.C)16
3.非十进制数之间的相互转换
1) 八进制数与二进制数之间的转换
  由于一位八进制数相当于三位二进制数,因此,要将八进制数转换成二进制数时,只需以小数点为界,向左或向右每一位八进制数用相应的三位二进制数取代即可。如果不足三位,可用零补足之。反之,二进制数转换成相应的八进制数,只是上述方法的逆过程,即以小数点为界,向左或向右每三位二进制数用相应的一位八进制数取代即可。
  例如:将八进制数(357.162)8转换成二进制数。
       3     5     7 · 1     6     2
     011   101   111     001   110   010
 即(357.162)8 = (11101111.0011101)2
 例如:将二进制数(101011110.10110001)2转换成八进制数。
101   011   110   ·   101   100    010
 5     3     6        5     4      2
 
(101011110.10110001)2 = (536.542)8
2)十六进制数与二进制数之间的转换
  由于一位十六进制数相当于四位二进制数,因此,要将十六进制数转换成二进制数时,只需以小数点为界,向左或向右每一位十六进制数用相应的四位二进制数取代即可。如果不足四位,可用零补足之。反之,二进制数转换成相应的十六进制数,只是上述方法的逆过程,即以小数点为界,向左或向右每四位二进制数用相应的一位十六进制数取代即可。
  例如:将十六进制数(5AB.8CE)16转换成二进制数。
       5      A      B ·    8      C      E
     0101   1010   1011    1000   1100   1110
(5AB.8CE)16 = (10110101011.10001100111)2
例如:将二进制数(1100101001011.001100101)2转换成十六进制数。
      0001 1001   0100    1011 ·   0011   0010    1000
       1     9     4     B         3      2       8
(1100101001011.001100101)2 = (194B.328)16
posted @ 2008-04-12 13:09 FlyWithMyHeart 阅读(761) 评论(0) 编辑

http://blog.csdn.net/psyl/archive/2008/04/09/2269272.aspx
单一职责原则SRP:Single Responsibility Principle
开放封闭原则OCP:Open-Close Principle
Liskov替换原则LSP:Liskov Substitution Principle
依赖倒置原则DIP:Dependency Invertion Principle
接口隔离原则ISP:Interface Separate Principle

  在面向对象设计中,如何通过很小的设计改变就可以应对设计需求的变化,这是令设计者极为关注的问题。为此不少OO先驱提出了很多有关面向对象的设计原则用于指导OO的设计和开发。下面是几条与类设计相关的设计原则。

1. 开闭原则(the Open Closed Principle OCP)
  一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。因此在进行面向对象设计时要尽量考虑接口封装机制、抽象机制和多态技术。该原则同样适合于非面向对象设计的方法,是软件工程设计方法的重要原则之一。我们以收音机的例子为例,讲述面向对象的开闭原则。我们收听节目时需要打开收音机电源,对准电台频率和进行音量调节。但是对于不同的收音机,实现这三个步骤的细节往往有所不同。比如自动收缩电台的收音机和按钮式收缩在操作细节上并不相同。因此,我们不太可能针对每种不同类型的收音机通过一个收音机类来实现(通过重载)这些不同的操作方式。但是我们可以定义一个收音机接口,提供开机、关机、增加频率、降低频率、增加音量、降低音量六个抽象方法。不同的收音机继承并实现这六个抽象方法。这样新增收音机类型不会影响其它原有的收音机类型,收音机类型扩展极为方便。此外,已存在的收音机类型在修改其操作方法时也不会影响到其它类型的收音机。 
 
2. 替换原则 (the Liskov Substitution Principle LSP)
  子类应当可以替换父类并出现在父类能够出现的任何地方。这个原则是Liskov于1987年提出的设计原则。它同样可以从Bertrand Meyer 的DBC (Design by Contract) 的概念推出。
  我们以学生为例,夜校生为学生的子类,因此在任何学生可以出现的地方,夜校生均可出现。这个例子有些牵强,一个能够反映这个原则的例子时圆和椭圆,圆是椭圆的一个特殊子类。因此任何出现椭圆的地方,圆均可以出现。但反过来就可能行不通。 
  运用替换原则时,我们尽量把类B设计为抽象类或者接口,让C类继承类B(接口B)并实现操作A和操作B,运行时,类C实例替换B,这样我们即可进行新类的扩展(继承类B或接口B),同时无须对类A进行修改。

3. 依赖原则 (the Dependency Inversion Principle DIP)
  在进行业务设计时,与特定业务有关的依赖关系应该尽量依赖接口和抽象类,而不是依赖于具体类。具体类只负责相关业务的实现,修改具体类不影响与特定业务有关的依赖关系。
  在结构化设计中,我们可以看到底层的模块是对高层抽象模块的实现(高层抽象模块通过调用底层模块),这说明,抽象的模块要依赖具体实现相关的模块,底层模块的具体实现发生变动时将会严重影响高层抽象的模块,显然这是结构化方法的一个"硬伤"。
  面向对象方法的依赖关系刚好相反,具体实现类依赖于抽象类和接口。
  为此,我们在进行业务设计时,应尽量在接口或抽象类中定义业务方法的原型,并通过具体的实现类(子类)来实现该业务方法,业务方法内容的修改将不会影响到运行时业务方法的调用。 

4. 接口分离原则(the Interface Segregation Principle ISP)
    采用多个与特定客户类有关的接口比采用一个通用的涵盖多个业务方法的接口要好。
  ISP原则是另外一个支持诸如COM等组件化的使能技术。缺少ISP,组件、类的可用性和移植性将大打折扣。
  这个原则的本质相当简单。如果你拥有一个针对多个客户的类,为每一个客户创建特定业务接口,然后使该客户类继承多个特定业务接口将比直接加载客户所需所有方法有效。

以上四个原则是面向对象中常常用到的原则。此外,除上述四原则外,还有一些常用的经验诸如类结构层次以三到四层为宜、类的职责明确化(一个类对应一个具体职责)等可供我们在进行面向对象设计参考。但就上面的几个原则看来,我们看到这些类在几何分布上呈现树型拓扑的关系,这是一种良好、开放式的线性关系、具有较低的设计复杂度。一般说来,在软件设计中我们应当尽量避免出现带有闭包、循环的设计关系,它们反映的是较大的耦合度和设计复杂化。
posted @ 2008-04-12 13:05 FlyWithMyHeart 阅读(134) 评论(0) 编辑

Ben Watson,知名开发者。任职于GeoEye,是其所属开发团队的领导者。本文发表于他自己的博客,阐述了十种学习新技术的方法。
这篇文章,是从我的《高效开发人员的五个特征》一文中抽出的一个观点。从我自身的事业和习惯中,我考虑了很多方式怎么样才能有效地学习。

1. 要看书。在成千上万的编程图书中,可能很大一部分根本毫无用处。但是仍然有很多图书对你的(编程)能力有很大的提升。我一直坚持,相比在网络上查找很多有用信息,在同类图书中查找要来得更容易更快捷。阅读技术图书可心更好地抓住核心内容。对于理论,架构和设计等方面来说,图书也一样很有帮助。只不过要找到高质量的、权威的信息,就不如网络上可供查找的范围广。

2. 读代码。这也是我很喜欢的一种方式。如果我并没有几年的专业编程工作经验,在学习之初我并不会去读很多复杂的代码。如果我要是早些开始学习,我将是一个比现在更好的程序员。但是,开始时我会从一些开源项目里,去学习那些源代码(当然,这些代码不能与我的工作有关,也不是我自己写的)。要从自己会使用到的,或者自己感兴趣的程序开始这项工作。我是从 Paint.net 这个网站里开始学习的,而且已经积累了很多关于 .NET 的编程技术。

读别人的代码可以为你提供更多不同的工作思路,这比你完全凭自己思考得到的工作方式要多。

3. 写代码。谨记,要写大量的代码。从根本上来讲,最好的学习方法就是实践。如果不写代码,你根本不能把(某种语言中)内在的东西学习透彻。学习之初,可以从一些技术指南和图书中照搬一些尽量简单的程序。当然,这种照搬是要自己完全手工输入,而不是复制和粘贴,这两种之间的效果差别是很大的。这种方法的主旨就在于,使知识内在化,并思考其用法,而不是盲目照抄。学习过程中,要时常查找新的 API 调用方法,这其实是简单的事情。

最重要的是,要写一个你自己的程序,不管它是一个简单的游戏,或者是一个参与开源项目的程序,还是一个公为你自己使用的简单插件。用不同的方式来写程序,尽量尝试使用新的技术,新的技巧,新的设计方式。一定要让现在的项目比以往的项目更好。想要成一个优秀的开发者,这一点是核心。

4. 与其他开发者交流。像 Apple,微软,Google 等大公司一样的新闻描述的一样,(与其他开发者交流)可以让你解决一些复杂的问题。虽然这并不能让你感觉到自己已经成一个团队或是社区的成员,但是这种方法可以让你接触到更多不同的想法。

不同类型的项目要求不同的设计方法,代码技术,开发流程和设计思想。如果你工作在一个小团队里,你不必与太多的人接触,只要在用户群会议中找到一些人(来讨论)即可。如果这样还不行的话,参与到在线论坛中与其他人讨论(这时你需要更努力地寻找高质量的讨论内容)。

6. 教会别人。相对于仅仅读代码之类的工作,教其他人学习可以让你更深入地学习某个技术,这种方法有着非凡的效果。教会别人某个技术,同样也会让你更专注于这种技术,并且可以比别人更深层次地理解它。同样你也会面对一些问题。

“如果你不能向一个六岁的儿童解析清楚一个概念,那么其实是你并没有完全理解它。”Albert Einstein说。

教学场景可以是无穷无尽的:与工作搭档一对一交流,休息碰面,非正式周会,学习茶会,教室,讨论发表会,等等。每周在相同理念开发者之间举办一次30分钟的非正式会议怎么样?每周,让几个人来就他们想要更深入了解话题,向大家传授这些技术知识,并且展开讨论。如果你知道你将要向团队成员们传授正学学习的知识,你是不是更想要了解这项技术的每个细节呢?

6. 收听网络电台。如果你有空闲的时间,可以订阅网络电台节目。我现在最喜欢的编程节目就是 .Net Rocks。这个节目还会做一些视频节目,叫做 dnrTV 。这样会让你即时捕捉到最新最好的技术。一个人是不能学习到所有知识的,而网络电台刚是一个学习了解广泛知识的途径。

7. 阅读博客。博客远远比阅读者要多,但是其中有一些却是极其优秀的。我这里不并不是要推荐博客,因为网络上已经有了足够多的博客。这是与真正在开发你所喜欢和使用的软件的开者联系的好方法。

8. 学习新的语言。即使你已经在 C(++,#) / JAVA 等语言上有很好的造诣,仍然有很多其他可以解决问题的编程语言。学习新的语言,是对你已有思维方式的挑战。这不仅仅是另一种语言,更是对思维的重新架构。的确,所有的语言最后都会被编译成汇编程序,但是这并不意味着高级语言毫无价值。

9. 学习不正确的方式。除了要学习应该怎么做,还要学习不应该怎么做。经常阅读 Dailywtf.com ,学习你并不知道的经验与教训。学习适当的面向对象设计方式,代码写作方式,和必须要写的代码等,是很好的方式,但是如果不细心的话也容易养成不良习惯。学习认识不正确的思路是负责项目开发至关重要的一环。

维基百科对很多觉的不正确方式有十分透彻的分类。

10. 要谦虚。

学习,意味着:

  • 用更好的知识代替不完美的知识
  • 增长你所不知道的知识

只有承认自己有所不足,才能有学习的动力。归根到底,就是谦虚,不对吗?如果你开始认为你已经掌握了所有需要的知识,那么你就危险了。真正的学习是如饥似渴地追逐知识并使其内在化,这需要很大的努力。我们都知道这一点,但是要必须时常不断地提醒自己。

posted @ 2008-04-12 12:58 FlyWithMyHeart 阅读(175) 评论(0) 编辑