《Code:The Hidden Language of Computer Hardware and Software》读书笔记:1-10章

        作为CS专业的学生,计算机组成原理之类的硬件课程学的一塌糊涂,自己都不忍直视,于是乎暑假决定找本书看看,在茫茫书海中找到了这本《编码:隐匿在计算机软硬件背后的语言》,果然是名不虚传。本书前面十章还算是基础,基本上都能理解个八九不离十。十一到十三章的学习历程也算是比较坎坷吧,但是大致的原理也是能理解到的,到了第十四章,如临大敌,看了几遍也是一知半解,索性就放放吧,等以后再慢慢消化。

        所以现在只能写一篇前十三章的读书笔记了,一来证明自己看过(XX到此一游)。二来呢,本身自己记性不好,况且好记性不如烂笔头,只盼着着自己闲下来的时候能复习一下。总而言之,一切为了学习偷笑。接下来,言归正传:

摩尔斯电码:                         

        摩尔斯电码由萨缪尔·摩尔斯(1791—1872)发明,随着电报机的发明而产生的。

        在摩尔斯电码中,字母表中的每一个字母与一个点划序列相对应,正如在下表中你所看到的:

        摩尔斯电码中字母相对应的各种点划序列—并非随意的,简短的码字分配给了使用频率较高的字母,不常用的字母如 Q和Z则分配以较长的码字。

        国际遇险信号 S O S的摩尔斯电码为“三点三划三点”。S O S并非缩写,选择它仅仅因为它有一个易记的摩尔斯电码序列。第二次世界大战中,英国广播公司选用贝多芬第五交响曲中的片段作为节目前奏— B A H、B AH、B A H、 B A H M M M M M,听起来颇像摩尔斯电码中V(代表Vi c t o r y)的码字。

        摩尔斯电码的一个缺点是它没有对大小写字母进行区分。除表示字母外,摩尔斯电码还用一组由点和划组成的五元序列来表示数字:

        摩尔斯电码被称为二进制码(binary code),因为编码中仅含“点”和“划”。

继电器:                                                                                         

        继电器对电报系统的工作十分重要。连接电报站的电线长距离时电阻很大,需要一种方法来接收微弱的信号并把它增强后发送出去。继电器通过使用电磁铁控制开关可做到这一点。 事实上,继电器放大了一个很弱的信号使其成为一个强信号。输入的电流形成电磁用以拖动金属杆,金属杆作为开关的一个部分连接到外接的导线上。这样,微弱的输入电流被 扩大形成比较强的输出电流。
        输入电流激发电磁铁,电磁铁吸引一根有弹性的金属条作为开关从而输出电流:

 

通用产品代码UPC(universal product code)          

        这个部分,个人觉得比较有意思,其中的设计也很巧妙,于是就把它摘抄下来了。

        U P C也是二进制代码。通常情况下,UPC是3 0条不同宽度的垂直黑色条纹的集合,由不同宽度的间隙分割开, 其下标有一些数字:

(书上的这个条形码似乎有些问题,少了两条细线,下面这个应该是正确的:

        可将条形码形象地看成是细条和黑条,窄间隙和宽间隙的排列形式,事实上,这是观察条形码的一种方式。黑色条有四种不同的宽度,较宽的条的宽度是最细条的宽度的两倍、三倍 或者四倍。同样,各条之间的间隙中较宽的间隙是最窄间隙的两倍、三倍或者四倍。

        但是,看待U P C的另一种方式是将它看作是一系列的比特。实际上,扫描仪只识别整个条形码的一条窄带,条形码做得很大是为了便于结算台的操作人员用扫描仪对准顾客选购的物品。扫描仪所看到的那一条窄带可以这样表示:

        它看上去是不是很像摩尔斯编码? 当计算机自左向右进行扫描时,它给自己遇到的第一个条分配一个值为 1的比特值,给与 条相邻的间隙分配一个值为0的比特值。后续的间隙和条被当作一行中一系列比特中的 1个、2 个、3个还是4个比特读进计算机要依据条或间隙的宽度而定。扫描进来的条形码的比特形式 很简单: 因此,整个UP C 只是简单的由95 个比特构成的一串。本例中,这些比特可以像下面这样分组:

        前3位通常是1 0 1,这就是最左边的护线,它帮助计算机扫描仪定位。从护线中,扫描仪可以知道代表单个比特的条或间隙的宽度,否则,所有包装上的UPC印刷大小都是一 样的。

        最左边的护线之后是每组有都 7个比特位的六组比特串,每一组是数字0~9的编码之一。接着的是5个比特的中间护线,这是一个固定模式(总是 0 1 0 1 0),它是一种 内置式的检错码。如果扫描仪在应当找到中间护线的地方没有找到它,扫描仪就认为那不是 U P C。中间护线是防止条形码被窜改或错印的方法之一。

        中间护线的后面仍是每组7个比特的6组比特串。最后是最右边的护线,也总是 1 0 1。最后 的最右护线使得U P C反向扫描(也就是自右向左扫描)同正向扫描一样成为可能

        因而整个U P C对1 2个数字进行了编码。左边的 U P C包含了6个数字的编码,每个数字占有 7个比特位。你可以用固定的解码表进行解码:

        注意,每个7位代码都是以0开头,以1结尾的。如果扫描仪遇到了第一个比特位值为 1或 最后一个比特位值为 0的情况,它就知道自己没有将 U P C正确地读入或者是条形码被篡改了。 另外我们还注意到每个代码都仅有两组连续的值为 1的比特位,这就意味着每个数字对应着条形码中的两个竖条。

        上表中的每个代码中都包含有奇数个值为 1的比特位,这也是用于检测差错和数据一致性 的一种机制,称为奇偶校验。如果一组比特位中含有奇数个 1,就称之为奇校验;如果含有偶 数个1,就称之为偶校验。这样看来,所有这些代码都拥有奇校验。

        可以看出,这些编码都是之前编码的补码:凡是 1的地方都换成0,凡是0的地方都换成1。这些代码都是以1开始,以0结束,并且每组都有偶数个 1,为偶校验。

        现在可以对U C P进行解码了,包装上用U P C编码的1 2个数字是:

0   51000  01251   7

        第一个数字(在这里是0)被称为数字系统字符,0的意思是说这是一个规范的 U P C编码。 如果是需要称重的货物的 U P C(像肉类或其他商品),这个数字就是2;订单、票券的U P C 编码的第一个数字通常是5。

        紧接着的 5个数字是制造商代码。

        最后一个数字(这里是7)称作模校验字符,这个字符可用来进行另外一种错误检验。为了解释校验字符是怎样工作的,我们将前11个数字(0 51000 01251)各用一个字母来代替:

A   BCDEF  GHIJK

        然后,计算下式的值:

3×(A + C + E + G + I + K)+(B + D + F + H + J)

        从紧挨它并大于或等于它的一个10 的整倍数中减去它,其结果称为模校验字符(modulo check character)。在上例中,有:

3×(0 + 1 + 0 + 0 + 2 + 1)+(5 + 0 + 0 + 1 + 5)= 3×4 + 11 = 2 3

        紧挨2 3并大于等于2 3的一个1 0的整倍数是3 0 ,故:

3 0-2 3 = 7

        这就是印在外包装上并以 U PC形式编码的模校验字符,这是一种冗余措施。如果扫描仪 计算出来的模校验结果和 U P C中编码中的校验字不一致,计算机就不能将这个 UPC作为一个有效值接收。

        U P C编码可以从两个方向读,这一点是非常方便的。如果扫描仪解码的第一个数字是偶校验(即7位编码中共有偶数个1),扫描仪就知道它正在从右向左进行解码。计算机系统用下表对右边的数字解码:

        这些7位编码与扫描仪由左向右扫描时所读到的编码完全不同,但不会有模棱两可的现象。

选猫问题:                                                                                

    (M×N×(W + T))+(F×N×(1 - W))+ B

        • +(以前表示求并集)现在表示O R。

        • ×(以前表示求交集)现在表示A N D。

        • 1 -(以前表示从全集中排除一些事物)现在表示 N O T。

        这样,刚才的表达式可以写成下面的形式:

(M AND N AND (W OR T))O R(F AND N AND (NOTW))OR B


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值