科学网

 找回密码
  注册
科学网 标签 二进制 相关日志

tag 标签: 二进制

相关日志

数字化、形式化、结构化的单一集合及其组合变化的分层集合
geneculture 2020-2-19 20:09
{0,1} = {开,关} = {兴奋,抑制} 数理开关-物理开关-生理开关/ 数字系统-机电系统-生物系统/ 从可验证数理模型的理论基础明确:单一集合是后续分层集合形式化体系建立的基准参照系。 {0,1}(单一集合) {00,01,10,11} {000,001,010,011,100,101,110,111} ... ... ... ... ... ... (分层集合) 在可计算数范围以内进一步收敛到不考虑无穷(∞)的情形(只需要考虑不同进制数系之间相互转换即可做出并验证数字计算机可批处理的各种人工智能系统软硬件) 数字化、形式化、结构化的单一集合及其组合变化的分层集合是软硬件系统构造和建构的基础。 单一集合与分层集合是可验证的无数实例的形式化理论模型。 八大形式体系内各种等价系统之间都可通过间接形式化途径服从P进制而相互转换(可视为是广义翻译)。
个人分类: Computer Science|1670 次阅读|1 个评论
超级抽象的序位坐标系:字式图表音像立体活体等的测量
geneculture 2019-10-4 07:17
计算、统计、相似,再进一步从物理到地理、生理、心理和社会的法理及事理与情理等等,最后是它们的理解与表达(不仅是识别、认识和认知及行为,而是意志、意识和意向及各式各样的用意)。都涉及其数学结构体系之间的函数关系和逻辑序位的变与不变乃至对它们的系统地解释或广义翻译。因此,序位逻辑、联合函数或联动函数、系统解释或广义翻译,都离不开对广义文本或广义语言的理解(其基础是形式化理解,其重点是针对性理解、内容理解和综合理解)。因此,就必然涉及最抽象、多形象和跨直觉的融合创新(它首先从数学领域的二进制数系和图灵机以及图灵测试的形式化中文字屋即孪生图灵机与数轴之间的关系开始,进而到与笛卡尔坐标系平行的双列表系,最后再到多维的坐标系及其平行的双列表系,整个构成了一个超级抽象的序位坐标系。可对字式图表音像立体活体等任何形式的广义文本或广义语言做系统地解释或广义翻译。由此形成智慧、智力和智能的三智聚会的大格局。这就是融智学的一个根本的研究或探讨。其聚焦的就是基础数学和应用数学涉及的计算、统计、相似和诸多的理的基础上的理解或表达(形式化理解是其一个基本的突破点)。-邹晓辉Geneculture 附录: 【关于加强数学科学研究工作方案 数学是自然科学的基础,也是重大技术创新发展的基础。数学实力往往影响着国家实力,几乎所有的重大发现都与数学的发展与进步相关,数学已成为航空航天、国防安全、生物医药、信息、能源、海洋、人工智能、先进制造等领域不可或缺的重要支撑。 https://m.thepaper.cn/baijiahao_3959579?sdkver=403dee86clientprefetch=1from=timelineisappinstalled=0 】
个人分类: 学术研究|1187 次阅读|0 个评论
各种进制之间关系之一斑
geneculture 2019-9-13 15:48
二进制(2)与其它进制(16、8、4)诸数系的等价形式
个人分类: 理论与实践|1103 次阅读|1 个评论
每日翻译20190613
Bearjazz 2019-6-13 07:41
# 编者信息 熊荣川 明湖实验室 xiongrongchuan@126.com http://blog.sciencenet.cn/u/Bearjazz Median networks In the median-network approach, sequences are first converted to binary data and constant sites are eliminated. Each split is encoded as a binary character with states 0 and 1. Sites that support the same split are grouped in one character, which is weighted by the number of sites grouped. This leads to the representation of haplotypes as 0–1 vectors. Median or consensus vectors are calculated for each triplet of vectors until the median network is finished. For 30 haplotypes, the resulting median networks are impractical to display, owing to the presence of high-dimensional hypercubes. Fortunately, the network can be reduced (i.e. some loops can be solved) using predictions from coalescent theory (Box 2). All the most parsimonious trees are guaranteed to be represented in a median network. Although mainly aimed at mtDNA data, median networks can be estimated from other kinds of data, as long as the data are binary or can be reduced to binary data. 中值网络 在中值网络方法中,先将序列转换为二进制数据,然后消除保守位点。每个拆分都被编码为具有状态 0 和 1 的二进制字符。支持相同拆分的站点被分组为一个特征,该特征由分组的位点数加权。这导致单倍型的表现为 0-1 向量。对每三组向量计算中值向量或一致向量,直到中值网络完成。对于大于 30 个单倍型,由于存在高维超立方体,因此产生的中值网络无法显示。幸运的是,可以使用溯祖理论(框注 2 )的预测来减少网络(即可以解决一些循环)。所有最简约的树都可以用中值网络表示。尽管中值网络主要针对线粒体 DNA 数据,但只要数据是二进制的或可以简化为二进制数据,就可以从其他类型的数据中估计出中值网络。 Posada D , Crandall K A . Intraspecific gene genealogies: trees grafting into networks . Trends in Ecology and Evolution, 2001, 16(1):0-45.
个人分类: 翻译作品|1429 次阅读|0 个评论
[转载]转王育民教授《 有关八卦的思考》
lcguang 2019-3-15 11:27
25. 有关八卦的思考 (20100106) 读“有道词典”的“互动百科”中“八卦”这一词条目中“ 科学太极八卦图与质能互相转化原理 ”段有感。 这一段论述可谓妙哉!西方近几百年所探索的物、生、化等科学,还不及几千年前的中国的太极、八卦和易经解决问题?西方科学真是“太肤浅了”!中国的易经确实是博大精深啊!这一论点可“真的”将中国的民粹思想发展到了顶峰!实在让中国人出了一口气!将近百年的屈辱、愤恨一扫而光!真是令人痛快!真不愧是一条阿 Q 好汉! 实际上上述的长篇论述是对简单的二元编码的一种极为肤浅、极为形式、极为无知的套用而已,完全谈不上是一种科学探讨。 太极有阴、阳两级,这对应于数学中抽象的“ 0 ”和“ 1 ”两个数字。对于“ 0 ”和“ 1 ”你可以赋予它任何实在的或虚拟的对象。八卦的抽象数学描述就是长为 7 的二元编码;八卦的全体有 64 卦,其抽象的数学描述就是长为 6 的二元编码。给定 n , n 为正整数,长为 n 的编码可以描述很多不同的实体集合,包括人类已经知道的和许许多多人类还不知道的实体集合。但我们不能由此得出,我们知道了抽象的长为 n 的二元编码,我们就已找到了未来的所有可以和其对应的实体集合了。在中国人发明了八卦之时,人类还根本不知道什么是电子、电子计算机、相对论、量子论、四种基本力、宇宙大爆炸、大统一理论等,虽然这些事物中有不少可以用二元编码来抽象地表述,但这些都是人类新探索出来的宝贵知识,绝不是二元编码早就“指出”或“预言”出来的东西,更不是“二元编码”这一“思想”指导下得到的研究成果。试图将近代科学成果简单地、形式地映射到二元编码的码字集合中,来证明二元编码思想的“博大”和“精深”是很肤浅的,也是很无效的,只不过是从形式上简单地套用而已。 ( 2010.01.06 ) 八卦的聪明过人之处是将一个有 64 个元素的集合,每一个元素对应一卦,各卦之间都有严格的对应和互补关系,组成为一个和谐的、天衣无缝的整体。用近代数学的语言说,就是构成一个群,也可视为一个线性空间。空间中的每个元素可以通过两种运算(加和乘运算)相互作用生成为、或映射为集中的另一个元素(挂),全体 64 个元素在加法运算下构成群, 63 个非零元素在乘法下构成群,除此之外,在一个线性空间中还提供另一种运算或关系(即标乘),即任何一卦都可以在太极(阴、阳)的作用下转变为全“ 0 ”卦,或不变化,即仍是原挂。虽然发明易经的人在当时还没有能力用近代数学语言描述八卦,但他们已经能将一个有 64 个元素的集合中的事物之间的关系用我们的自然语言讲得清清楚楚、明明白白了,这是很了不起的事,他们的智商绝不在当代人之下! 有了这样一个和谐的、完美的集合,我们的祖先们就用这个集合来解释他们所看到的万物,和他们内心世界所想的事情,并且试图用这个集合,即八卦来预测一些未来的可能发生的事物,从而形成一整套“易经”。此外,他们还要用这个集合来描述其自身,成为中医的思想基础,或指导思想。 产生易经的时代,人们所积累的知识是很有限的,人们认识世界的手段也是很贫乏的,大多数情况下还只能用人与生俱来的五官去观察和感知世界,人们的想象力也是有限的,具有很高智商的人也只能想象出和处理一个有 64 个元素的集合,即八卦。问题不在于八卦这个集,这个集合还是一个很美、很和谐的系统。问题出在人们要将具有无限多个元素、极为复杂的宇宙、万物、生命系统等都映射到一个只有 64 个元素的八卦阵中去认识和解释,这就使得易经变得越来越玄乎,落入玄学的泥坑。更可悲的是,在当代有一些人还在继续几千年前古人的梦,想用八卦来说明世界万物,甚至远超越古人,要用八卦来说明近代科学技术中的一切成果和尚未能解决的问题。这一方面说明他们对于近代科学的无知,另一方面也证明他们的智商远低于古人。 DNA 是一个远较八卦编码复杂得多的编码,人类基因组计划动员了几乎全世界的有关科学家,花费了几十亿美元,虽然已胜利提前完成,但距全面理解和描述人的生命体还有很长的路要走,难道一个只有 64 个元素的八卦就能说清楚人这一极为复杂的生命体? 用易经、八卦之类的思想来指导和发展科学(包括自然科学和社会科学)是不可能成功的,中国的近代科学为什么落后?与我们总守着祖传的八卦,不求进取不无关系吧。 ( 2010.01.07 晨) 附 : 科学太极八卦图与质能互相转化原理 (节录 “有道词典”的“互动百科”中“八卦”词条中的一段 ) 八卦 科学太极八卦图,描绘了《易经》阴阳理论中阴阳交感生万物的道理;质能互相转化原理阐述了能量平衡创生物质的原理。二者经过比照辉映确是惊人的契合乃至完全一致,也充分证明了同是真理必然产生殊途同归的结果。在这里,将《易经》中的阴阳两仪与质能转化原理中的基本高低能位相比较,可以这样认为:阴仪即是基本低能位,阳仪即是基本高能位,二者通称为一个阶能位。单一阴仪和阳仪的结合形式是少阳与少阴,也就是单个的基本高低能位只能构成基本能量系统,平衡后创生了基本物质粒子 -- 质量子。因平衡旋向有正反,导致质量子有两种形式,就是极性不同的正反质量子,如若视少阳为正质量子,少阴就是反质量子,它们是最简单的第一层次物质,称谓一重物质。假若宇宙间只有一阶能位和一重物质,那么宇宙的具体模式将是少阴和少阳构成的两仪整体结构,上下为少阳,右左为少阴。 阴仪和阳仪的二重结合有四种形式,即 《易经》 中的四象。老阴和老阳不是物质是二阶能位,少阴和少阳是一重物质。四象整体是二阶能位一重物质的混合系统,平衡后创生了第二层次物质系统,称谓二重物质系统。假若宇宙只有二重物质所构成,宇宙的具体模式图象将是四象的整体结构图示。 阴仪和阳仪的三重结合有八种形式,即《易经》中的八卦,八卦的整体图示如前所描绘的科学八卦图 5 所示。其中的乾和坤分别是三阶高低能位,其余六卦是具有三阶能位一重物质的离子态物质,兑、离、巽是三种形式的三阶一重阳离子,震、坎、艮是三阶一重阴离子,其中兑与巽都是阳离子,震与艮都是阴离子,但它们的爻位不同互为同性反向的离子。八个卦对称比较,乾和坤不是物质是两种异性无形的三阶能位,兑与艮,震与巽,离与坎都是异性反向的等离子。八卦的整体是十二块阴和十二块阳的三重结合,构成了三阶能量系统,平衡后创生了第三层次物质系统,称谓三重物质系统,如若构成宇宙,其具体模式将如科学八卦图所示。当然,十六卦、三十二卦、六十四卦等等,都可以与质能互相转化原理一一对应,并且高层次物质系统是低层次物质系统经过高层次能位作用达到平衡而创生。例如太阳系就是太阳本身与行星系统之间的能位差构成了太阳系级的能量系统,它们的高低能位互相作用达到平衡创生了太阳系物质系统。 从两仪、四象到八卦,其中的阴仪、阳仪、老阴、老阳、乾、坤都是不同阶次的高低能位,分别可以构成由低阶到高阶的能量系统;少阴、少阳、整体两仪、整体四象、整体八卦是由简至繁的物质系统;兑、离、震、巽、坎、艮都是能量和物质相混合的阴阳离子态所构成。科学太极八卦图,图示了质能互相转化原理,可以概括神秘玄奥科学太极图图示了质能互相转化原理,是自然世界万事万物的总图谱,是描绘微观至宏观所有物质创生的大统一模型。 前边引言中提到,现代科学宏观理论和微观理论还未完全整合和统一,因此近年来不少学者都在探讨大统一论、大统一力,大统一模型,以此求得适合两者的统一答案,但时至今日还没有最终的理想结果。笔者认为易经阴阳理论与质能转化原理的融合体现了上述问题的统一性。 质能互相转化原理中,能量平衡创生物质、物质失衡转化为能量,这是《易经》中无极生太极、太极还无极的过程。特别是各阶能量系统的平衡,创生了质量子到宇宙的所有系列的物质系统,这一过程密切符合了太极生万物的道理。这种创生物质的阴阳论和能量平衡论,是创生微观至宏观所有物质的大统一论。两种理论的结合更加完善了这一理论。 在科学太极八卦图中,将阴仪视为基本低能位、阳仪视为基本高能位,因此阴阳鱼描绘了能量平衡创生万事万物的总法则,八卦象则描绘了,能量平衡创生物质的具体结构的总规律,所以科学太极八卦图是描绘微观至宏观所有物质创生的大统一模型。 关于四种基本力,电磁力、弱作用力、强作用力和万有引力。这四种力在科学太极八卦图中的具体表现是:除乾坤之外其余六卦中都有一阴一阳组成的少阴或少阳。少阴或少阳都是单一的基本高低能位间的平衡力结合而成,这种基本平衡力,因平衡方向有正反,故而有极性,所以它是有极性的电磁力。八卦图相邻卦之间如乾兑、兑震、坎坤、坤艮、艮巽、离乾六对卦间都有单一的阴阳结合力,这个力是构成同一物质相邻离子间的平衡力,因平衡范围小,作用力度不大,应是弱作用力。弱作用力与电磁力都是单纯的阴阳之间或者说基本高低能位之间的基本结合力,故性质相同,现代科学也已证明二者是统一的电弱作用力。八卦象中对称卦间,如乾坤、兑艮、震巽、坎离四对卦之间,还有四阴卦与四阳卦之间,四阴仪卦与四阳仪卦之间,都是互有阴阳全部对应紧密结合的合力,或者说是构成物质正反离子间互有的全部基本高低能位平衡的合力。这个力平衡范围较大,因是全部基本力的合力,力度强大应是强作用力。强作用力因是离子间互有阴阳的合力,故不显示极性。另外两仪整体物质之间,四象整体物质之间,八卦整体物质之间,还有两仪、四象、八卦各层次物质之间都互有阴阳的结合力,这种自成系统相互独立的所有物质间基本高低能位平衡的合力应是万有引力。这个力的作用强度和作用范围随着物质增多而增大,又是物质间互有阴阳结合的合力,故而是长程的无极性的力。 以上四种基本力虽然形式不同,但都是高低能位的平衡力,或者说是阴阳结合力,因此四种基本力的统一力应是高低能位的平衡力,归根结底是不同形式的基本高低能位相互作用的平衡力。 当然,阴阳理论和质能互相转化原理还可以解释更多的科学难题以及现代科学无法解释的不明现象,例如测不准原理为什么是自然法则;光速在物质世界中为什么不可超越;黑洞是什么;何为时空;宇宙的有限与无限等难题。还有 ?? 幅所限也不是本文涉及及范围,故不在此赘述。 “ 太极 ” 是由红黄蓝三种基本粒子组成的统一场,是万物所从一而出的 “ 众妙之门 ” ,是终极的宇宙本源。虽内涵阴阳能量子,但总的本体、本质、本理是 “○” 。为了表示其 “○” 中涵阴阳正负能量,亦用 “○” 表示 “○” ,谓之 “ 无极而太极 ” 。 “ 八卦 ” 是由红黄蓝粒子组成的太阳光子(即红、橙、黄、绿、蓝、靛、紫、绀八色光子),太阳光是八卦光。八卦光是组成电子、质子、中子、原子、分子、天体、人体的直接能量子。由八卦光组成的宇宙万物皆分八卦。八卦光是八卦能量子。八卦能量和宇宙万物通过 E=mc2 公式互相转代。 太极生八卦,八卦归太极。宇宙就是这样一个物质化、生命化、阴阳化、辩证化是太极八卦图。 八色光子是太极八卦图,由此组成的电子、原子、天体、人体是太极八卦图。男女是太极八卦图,人体之左右两半是太极八卦图,地球之东西两半球和人体之左右两半一样,是一个典型而美丽的太极八卦图。 男女的生理、心理、功能是相反的、互补的,地球东西两半球的人类,其生理、心理、功能及由此产生的棈神文化亦是相反的、互补的。二者如同人的两半身、两半脑一样,相反相成,缺一不可。 现代科学是西方科学。西方科学和东方文化一样,都是局部的、地区性的、片面的、狭隘的、残缺不全的半球文化,二者皆未包括对方,都不是包罗东西古今全部文化要素的地球文化、世界文化。 现代西方科学仅是西半球的地区文化、乡土文化,是一种偏枯不全的局部真理。虽然这种文化以实验的、数理逻辑的、技术的 “ 科技型 ” 面目出现,全身挂满了 “ 科学 ” 的标签,但是由於她具有严重的片面性、局限性和残缺性,先天不足,因而,她不可避免地存在著内在的、巨大的危机。 这种危机主要表现在: 一、基本物理学 光学不知道光的本质是什么,错误地把光的 “ 阴阳八卦 ” 本质解释成了 “ 波粒二象性 ” 。 “ 波粒 ” 仅是外徵并非本质。 电学不知道电是什么,不知道电的起源和本质,更不知道电为什么分阴阳,会斥同引异。 热学不知道热是什么,低温物理学不知道寒是什么,更不知道热与寒的相反性。寒热即阴阳二氧,它们是宇宙间最大量、最普遍的现象。 力学不知道力是什么,不知道力的起源和本质,更不知道四种力、天体动力、生命力、意念力是什么。 粒子物理学不知道最简单的基本粒子是什么,不是把目标选在光子上,而是把精力钱财白耗在 “ 夸克 ” 假说上。殊不知,即是 “ 夸克 ” 存在,正反 “ 夸克 ” 相遇,还是湮灭转化成了纯能量--光子,只有光子才是最接近的终极粒子,而由光子分解而来的红黄蓝粒子才是真正的基本粒子。 原子物理学不知道原子的色、香、味、温、力等各种属性和本质是什么,把组成万物和人体的有血有肉的原子描述成了一堆抽象的数学公式,对原子的实质一无所知。 二、理论物理学 相对论的 e=mc 2 公式把物质转化成了能量,量子论的 e=n2 公式则立即把能量转化成了频率。世界万物最终归於频率。从相对论和量子论得出的基本结论是:频率创造世界(万物和人)。这等於承认:音乐创造乐器。这是由现代最先进的 “ 科学 ” 得出的总结论。这里,宇宙间的一切物质的、生命的、精神的、社会的现象,都由振动频率创造出来。至於 “ 频率 ” 是什么,它的起源和本质是什么,它怎样创造了万物和人类,就不得而知了。 物理学主要是研究能量的科学,而至今不知道能量(热、寒、光、电)的阴阳八卦本质,不知道负能量、负质量、负引力的存在,只讲 123 ,不分+ 0 -,这种所谓的 “ 精密科学 ” 、 “ 成熟科学 ” ,其精密性、成熟性从何证明呢? 由於基本的物理学和理论物理学对基本粒子、能量、力、电子、原子这些简单的基本物理现象一个也未弄清楚,其理论是糊涂账,完全钻了牛角,因而,由此决定了宇宙学既不能解决宇宙的起源与本质问题,也不能解决宇宙的运动与演化问题,对空间和时间的实质,对宇宙的代表--人,更无基於真理的解释。 三、化学、生物学及其他 物质由能量聚集而成。化学是研究物质的科学。物理学不知道 “ 能量 ” 是什么,化学必然不知道 “ 物质 ” 是什么。现代化学只知道原子、分子的名称和符号,并不知道原子、分子的属性、本质、机制是什么,既不知道是什么,也不知道为什么。 生物学并不知道生命是什么,不知道生命的起源、本质和演化,更不知道生物为什么分雌雄,有老少,人有感情,有思想,能创造,人这种物质为什么有如此功能。 对中医、气功、心灵、人体特异功能,用现代生物学及任何理论均无法解释,这是因为现代物理学、化学、生物学存在着根本的问题。 综上所述,现代科学的问题是全面的、根本的,其危机是深刻的、巨大的。 理论上的危机,导致了技术上的危机。 环境污染,生态破坏,人口爆炸,资源枯竭,沙漠扩大,森林速减,粮食短缺,战争威胁,等等,正在把人类推向绝境。长此下去,人类必将从地球上消失。 人类至今不能控制自然,自主生命,不仅造不出一只小小的蚂蚁,连人类自身的许多疾病也治不了。各自然界本身的技术相比,人类的技术不仅十分落后,而且孕育著灭绝人类的极大危险性。 要解决人类的危机,必须首先解决技术上的危机;要解决技术上的危机,必须首先解决科学(主要是物理学)理论上的危机,这是根本。 现代科学的根本问题不在实验和定量描述方面,而在对本源的思考和定性分析方面。只要解决了宇宙的本源和本质这个主要矛盾,一切问题就迎刃而解了。
个人分类: 杂谈|2411 次阅读|0 个评论
登高望远抒情怀
热度 3 suqing1961 2019-2-23 10:39
结绳拨珠挥笔研, 电脑推算启新篇。 进位制多优点异, 零一数少操控简。 提花上下织经纬, 打孔虚实传密笺。 法古中西集智慧, 创新科技常溯源。 写这首短诗,旨在概述信息技术的发展历程,试图诠释当今的科技创新与中外古代科技成果传承之间的关系。 人类自诞生之日起,就离不开计数。最初用两个手掌掰着手指头数数,之后是摆石块计数,并能做简单加减运算。公元前约1500年,南美洲秘鲁印加族人每收进一捆庄稼,就在绳子上打一个结,用绳结的多少来记录收成的多寡。结绳计数由此应用众多。相传,古波斯王派军队远征斯基福人,命卫队必须坚守耶兹德河桥60天。但是,如何才能保证命令执行的准确天数呢?聪明的波斯王在皮条上打了60个结,嘱咐守军每天解开一个,待所有的结全部解完,任务就算完成。 随着社会不断发展,与人们打交道的数字越来越复杂,进位制由此应运而生。据考证,古美洲玛雅人已发明20进位制,古 巴比伦 人也知道进位制,但用的是60进位。中国古人发明的十进位制算筹记数法,使得计数和运算更加便捷;北宋期间发明算盘后,运算就变得更加灵便、准确了。有了各类书写笔的发明,人们得以十分方便地在纸上进行运算、推演。电子计算机尤其是超级电子计算机的出现,使得自动、高速运算、处理海量数据成为家常便饭,人们还可通过数值模拟来解释以前无法实验的自然现象,预测未来事物发展变化。 众所周知,电子计算机采用的是二进制编码,它利用高、低电平(分别用“1”和“0”表示)两种状态,将模拟电路转换成数字电路;通过控制逻辑电路开关的接通和断开(也分别用“1”和“0”表示),来完成复杂的运算加工和数据处理。中国科技史专家认为,这种信息编码方式很早就有了,最早呈现在我国汉代的花楼式束综提花机里。这种织机的关键技术集中反映在花本技术上。花本就是指按照事先设计好的图案,使成千上万根经线有规律地交互上下提综,几十种纬线有次序地横穿排列,做成的一整套花纹记忆装置。它相当于一套已经编好的程序,古人通过经线的高、低两种状态将复杂的图案信息储存在花本当中。织机上方的挽花工按照花本程序提起部分经线,下方的织工投梭编织相应的纬线,经纬线交错就在织物上组合成了完整的预设图案。 以花本存储提花信息、控制线综,开创了用编排好的程序控制经纬丝线运动的先河。花楼式束综提花机经两晋南北朝隋唐时期的改进,到了宋代得以完善,并经丝绸之路传入西方。1725年,法国工程师布乔受中国提花机启发,用穿孔纸带取代花本,控制提花编织机的织针运动。1801 年,法国工程师贾卡将穿孔纸带换成穿孔卡,采用打孔的硬纸板来控制织布图案的提花,即通过孔板上有孔洞和无孔洞两种状态来控制织机经线的高低——有孔对应经线提升,无孔则对应经线下沉,从而实现了纺织图案信息的机械化解码。1888年,美籍德国人霍利瑞斯借鉴穿孔卡输入数据的方法,发明了自动数据处理机,被认为是现代计算机数据处理技术的肇始。现代电子计算机据此通过采用二进制实现了编码、解码的电子化。可以说,二进制思想的雏形起源于中国古人发明的提花机,提花机由此被誉为现代信息技术的原点。 2017 年9月17日是第14个全国科普日,中国科技馆专门设计了“登高望远”科普展览项目。该展项由中国古代花楼提花机、贾卡提花机、现代电子计算机和“墨子”号量子通信卫星4个标志性展品组成,阐释了信息技术的发展变迁。其中,作为信息技术发展的最前沿成果,世界上第一颗量子通信卫星——中国的“墨子”号科学实验卫星于2016年8月16日发射升空,它利用量子纠缠特性大大地提高了二进制编码的效率和安全性。时任中共中央政治局常委刘云山等党和国家领导人参观了整个展览,并与花楼机织工现场合作编织,共同完成了编织的最后一道工序,织出了汉代登高仿制锦。锦上织有“登高望远”4个字,彰显了中国古人的博大胸怀和聪明才智,重新描绘了“一带一路”新的愿景。 陪同参观,不胜感慨,赋诗一首,以表情怀: 量子通信显神奇, 天罗织就无踪迹。 提花蕴含二进制, 贾卡催生计算机。 科技交流促发展, 创新驱动托两翼。 登高望远抒情怀, 一带一路奠伟绩。 注:欲阅读更多内容,敬请关注本人微信公众号。
个人分类: 信笔涂鸦|1813 次阅读|3 个评论
【MATLAB技术贴】保存--二进制文件、图片
cj000211 2018-7-31 13:34
1、将数据保存为surfer或其他软件可以识别的 *.dat格式文件 将矩阵a输出为D盘目录下的1.dat文件,运行如下代码: a= ; filename='D:\\1.dat'; save(filename,'a','-ascii'); 2、将figure里面的图形输出为图片 a= ; figure; plot(a); print(gcf,'-r300','-dpng','d:\\111.png'); 注释:gcf为当前的图像,可以换成具体的句柄 -r300表示分辨率是300,修改为-r150,表示分辨率为150 -dpng表示输出格式为png,可以根据需要换成jpeg、tiff、pdf、eps等多种格式,但前面都需要加-d
个人分类: MATLAB|3913 次阅读|0 个评论
人类思想交流是一盘很大的棋:双字棋盘是全球双语测序定位系统
热度 1 geneculture 2015-12-29 12:16
人类思想交流是一盘很大的棋:双字棋盘是全球双语测序定位可掌控的知识导航系统。 有必要首先耐心读懂以下原创文章的中文原版论著,然后,再汉译英或用英文来做相应的转述或解释。它们分别是: 两大类形式化方略_邹晓辉.pdf 双语信息处理方法及原理_邹晓辉_邹顺鹏.pdf 8 如何实现文化与经济、政治、社会、生态的协同发展.pdf 双字棋盘: 本发明是双字棋盘,即一种基于算术和语文这对广义双语信息处理的对称矩阵。其目的是提供一种可通过进一步开展语言游戏以虚拟未来智慧城乡的专用人机对话平台,涉及优化的广义翻译。其特征在于:它把算术和语文视为广义双语,把二进制数与十进制数、英文与中文均视为狭义双语,把术语与俗语视为另类双语,从而可在三类双语范围内重新解释图灵测试和中文屋子,它是数字和文字以对称矩阵的方式在广义双语信息处理系统中建构的人机对话平台。其有益效果是:三类双语可化解母语如汉语非主流、知识缺原创和软件无根基这样的“三大瓶颈”,可重组新一轮的人机大赛,可开展以“蓝图-模型-范例”方式虚拟各种各样的未来智慧城乡构想或建构的语言游戏。 专利类型: 发明 专利申请(专利)号: CN201410157262.9 申请日期: 2014年4月21日 公开(公告)日: 2014年9月24日 公开(公告)号: CN104056450A http://industry.wanfangdata.com. ... nt_CN201410157262.9 http://blog.sina.com.cn/s/blog_495a53510102w1kt.html
个人分类: 双语信息处理|822 次阅读|4 个评论
C语言中如何从文本文件中读写double类型的数据
Geophoenix 2015-12-2 12:24
double类型的数据读写在一般的C语言编程书籍很少提及,不知道这是认为大伙都知道还是咋的。这里记录一下,以备后用。 File *fp; double dat; //从文本中读入一个double类型的数据 fscanf(fp,%lf,dat); //%lf是表示的double类型的数据 //向文本文件中写入一个double类型的数据 fprintf(fp,%lf,dat); //至于从二进制文件中读写就容易的多了,俺是比较喜欢二进制数据,规整:) //从二进制文件中读入一个double类型的数据 fread(dat,sizeof(double),1,fp); //向二进制文件中写入一个double类型的数据 fwrite(dat,sizeof(double),1,fp);
个人分类: 编程|8973 次阅读|0 个评论
对世界基本物性的看法:空实二源
zca1965 2015-10-26 21:25
空实二源 张崇安 根据《周易》为群经之首的说法,国学最基本的思想就是以阴和阳的观点看待世界。即使今天的西方自然科学,也处处可见阴和阳的烙印。譬如:二进制、正电子与负电、正物质与反物质等等。对于时空最基本的看法,现代西方基础物理学相对论和量子力学认为:空间和时间是物质运动的附属品、可以随物体运动缩伸、可以与和物质互相转化、量子纠缠属于超距作用等等,世界失去一个清晰的衡量基础,类似混沌,属于一元论。 与一元论对立的是 “一阴一阳谓之道”的二元论。认为我们的世界由两种等同原始、相互区别、相互依存、完美融洽、对立统一的元素组成。北宋张载根据周易哲理提出“一物两体”说,他说:“两体者: 两体者,虚实也、动静也、清浊也、聚散也”;在西方,牛顿在定义物质的质量、动量同时,定义空间“其自身特性与一切外在事物无关,处处均匀、永不移动……”,也属于二元论。而黑格尔对立统一哲学也属于二元论。 上世纪八十年代,笔者根据周易哲理和辩证法,总结出世界 “空实二源”基本物性观: 1) 世界由空间和实物构成,称为“二源”,别无它源; 2) 空间具有同一性、无界性、静止性; 3) 实物具有各异性、有界性、运动性; 4) 空间和实物不相互作用、不相互转化。 上述观点与西方原子论和虚空论类似。空实性质恰对立统一并完美融合。遂 有如下推论: 1、不存在无界的实物,也不存在均匀的、不动的、可以作用于实物的连续媒介。大范围静止的以太是不存在。有无不可以互变;对于光本性,支持了粒子说,否认了连续媒介说。 2、惯性与力起因:认为惯性的根源是空间的同一、无界、静止;力的根源是实物各异、有界、运动。惯性与力是一对矛盾,二者的度量则是实物粒子在占据空间时发生的一种碰撞式概率分布现象,就如一滴墨水在水盆中扩散,总是由密处向疏处走,表现为一种趋向力。 3、唯心与唯物的阐释:历史上唯心、唯物真正争论焦点并不是先有地球还是先有大脑,而是主体原始动力为第一性还是客体外力为第一性——这实质是主体惯性与客体间力孰先孰后的问题。因为惯性与力等同原始的矛盾,故唯心和唯物也是一对矛盾,没有先后主次之分。据此,涉及人惯性和人外力的各哲学门派可以归一。 4、时间的看法:认为时间不是一个本源,而是次于空间、实物的概念。其周期性、长短性、单向性都可以从空实二源导出。 5、物理学基本问题:空实二源的空间观念与牛顿空间完全一致。故与相对性原理、牛顿力学相呼应;空实不作用、不转化恰恰是物质不灭定律和动量、能量守恒的依据;根据空实二源观,场必然是实物粒子在空间中的分布现象、光也由空和实组成、实物粒子因有界而不可能无限小、宇宙运动因实物的各异性而呈现为单向性。 6、数学纲性语言可描述物理实在问题:由于实物的各异、有界导致质和量的产生;由于空间的同一、无界、静止导致质和量的稳定性和均匀、对称、直线。就是数学存在的基础。
981 次阅读|0 个评论
Globk平差
热度 1 zsxtym 2015-10-9 17:19
1.将结算文件夹中的htest*文件复制到glbf 2.将tables的卫星信息文件svnav.dat 3.将htest*文件转化为二进制文件,代码:htoglb ./ ./svnav.dat ./h* 4.文件夹下会出现.glr和.glx文件,如果网络是长距离使用.glr,否则就用.glx 5.将.glx转到gsoln文件夹下的test.gdl,代码:ls ../glbf/*.glx ./test.gdl 6.设置已知点,可以是itrf*文件(需要去网站上下载),或者lfile文件(在要求的点前面加上#号) 7.在gsoln文件夹的上级文件夹中,输入:sh_glred -cmd,这样gsoln文件夹会出现globk_comb.cmd和glorg_comb.cmd 8.设置globk_comb.cmd:apr_file 的路径输入正确;glorg_comb.cmd里设置好控制点测站名称:stab_site 9.解算:globk 15 globk_test.prt globk_test.log test.gdl globk_comb.cmd,其中15是所有的测站总数,出现Normal Finish,就算结束了 10.结果文件是globk_test.org,里面会有详细的说明和数据结果,Unc.的结果就算平差后的坐标文件,可以用grep 提取出来 谢谢大家观看,有什么不对的地方还请指正。 (其中参考了 中国有色金属工业西安勘察设计研究院 尹业彪的视频)
个人分类: gamit|5767 次阅读|1 个评论
Binomial Multiplicative Measure 的Matlab数值实现
sanshiphy 2014-9-17 23:13
2014 国庆 第一次修改 BMM 是展示多重分形的一个简单数学模型,具体介绍参考 Jens Feder, Fractals, 1988. 本文只是简单介绍如何用 Matlab 数值实现该模型。 方法一: % construct of BinomialMultiplicative Process clear;clc; n=11; p0=0.25; p1=1-p0; N=2^n; b=0:N-1; p=zeros(1,N); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 下面一段是代码的核心,其思想是在第 n 代二重分裂后,共有 2^n 个子线段,将该子线段从左 至右依次编号为 0, 1, 2, …, 2^n-1 ,然后将每个编号转换成二进制数,注意有些二进制数 前面需要补 0 ,保证有 n 个位数。数每个 2 进制数的 0 的个数(包括补上的 0 的个数),记做 k , 则每一线段对应的概率是 (p^k)*((1-p)^(n-k)). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% for i=1:length(b) a=dec2bin(b(i)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% dec2bin 的作用是将十进制数转换为二进制数,二进 制数是以字数窜形式存储 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% temp=zeros(1,n); temp=num2str(temp,'%d'); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %d 的作用是保证数值转换为字符串时,字符之间无 空格 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% temp(end-length(a)+1:end)=a; % 补 0 k=sum(temp=='0'); % 数 0 的个数 p(i)=(p0^k)*(p1^(n-k)); clear k tempa; end 方法二: 以上绿色部分代码可以用下面更简单的代码代替: a=fi(b',0,n,0); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 生成一个对象,对象中每个元素前无符号(第一个 0 ),有 n 位数字(中 间的参数 n ),这 n 位数字中,没有小数位(最后一个 0 )。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% temp=bin(a); % 将对象用二进制表示出来 temp=temp'; k=sum(temp(1:n,:)== '0' ); % 数 0 的个数 p=(p0.^k).*(p1.^(n-k)); 结果: 1) Binominal Multiplicative Measure (p0=0.25,n=11) 2)魔鬼阶梯 3) 质量指数谱(数据点是数值模拟结果,实线是理论值) 4) 多重分形谱(实线是理论结果,点是根据模拟数据计算的结果,计算方法参见Chhabra and Jensen, PRL, 62: 1327-1330, 1989, 模拟数据的p0=0.7, n=14)
个人分类: 学习笔记|2769 次阅读|0 个评论
[转载]c++编译生成文件名称
duyaqin 2014-4-17 15:17
APS:存放二进制资源的中间文件,VC把当前资源文件转换成二进制格式,并存放在APS文件中,以加快资源装载速度。资 源辅助文件。 .BMP:位图资源文件。 .BSC:浏览信息文件,由浏览信息维护工具(BSCMAKE)从原始浏览信息文件(.SBR)中生成,BSC文件可以用来在源代码编辑窗口中进行快速定位。用于浏览项目信息的,如果用source brower的话就必须有这个文件。可以在project options里去掉Generate Browse Info File,这样可以加快编译进度。 .C:用C语言编写的源代码文件。 .CLW:ClassWizard生成的用来存放类信息的文件。classwizard信息文件,ini文件的格式。 .CNT:用来定义帮助文件中“Contents”的结构。 .CPP或.CXX:用C++语言编写的源代码文件。 .CUR:光标资源文件。 .DEF:模块定义文件,供生成动态链接库时使用。 .DLG:定义对话框资源的独立文件。这种文件对于VC工程来说并非必需,因为VC一般把对话框资源放在.RC资源定义文件中。 .DSP:VC开发环境生成的工程文件,VC4及以前版本使用MAK文件来定义工程。项目文件,文本格式。 .DSW:VC开发环境生成的WorkSpace文件,用来把多个工程组织到一个WorkSpace中。工作区文件,与.dsp差不多。 .EXP:由LIB工具从DEF文件生成的输出文件,其中包含了函数和数据项目的输出信息,LINK工具将使用EXP文件来创建动态链接库。只有在编译DLL时才会生成,记录了DLL文件中的一些信息。 .H、.HPP或.HXX:用C/C++语言编写的头文件,通常用来定义数据类型,声明变量、函数、结构和类。 .HLP:Windows帮助文件。 .HM:在Help工程中,该文件定义了帮助文件与对话框、菜单或其它资源之间ID值的对应关系。 .HPJ:由Help Workshop生成的Help工程文件,用来控制Help文件的生成过程。 .HPG,生成帮助的文件的工程。.ICO:图标资源文件。.ILK:连接过程中生成的一种中间文件,只供LINK工具使用。 .INI:配置文件。 .LIB:库文件,LIN K工具将使用它来连接各种输入库,以便最终生成EXE文件。 .LIC:用户许可证书文件,使用某些ActiveX控件时需要该文件。 .MAK:即MAKE文件,VC4及以前版本使用的工程文件,用来指定如何建立一个工程,VC6把MAK文件转换成DSP文件来处理。 .MAP:由LINK工具生成的一种文本文件,其中包含有被连接的程序的某些信息,例如程序中的组信息和公共符号信息等。执行文件的映像信息记录文件。 .MDP:旧版本的项目文件,相当于.dsp .NCB:NCB是“No Compile Browser”的缩写,其中存放了供ClassView、WizardBar和Component Gallery使用的信息,由VC开发环境自动生成。无编译浏览文件。当自动完成功能出问题时可以删除此文件。编译工程后会自动生成。 .OBJ:由编译器或汇编工具生成的目标文件,是模块的二进制中间文件。 .ODL:用对象描述语言编写的源代码文件,VC用它来生成TLB文件。 .OLB:带有类型库资源的一种特殊的动态链接库,也叫对象库文件。 .OPT:VC开发环境自动生成的用来存放WorkSpace中各种选项的文件。工程关于开发环境的参数文件。如工具条位置信息等。 .PBI、.PBO和.PBT:由VC的性能分析工具PROFILE生成并使用的三种文件。 .PCH:预编译头文件,比较大,由编译器在建立工程时自动生成,其中存放有工程中已经编译的部分代码,在以后建立工程时不再重新编译这些代码,以便加快整个编译过程的速度。 .PDB:程序数据库文件,在建立工程时自动生成,其中存放程序的各种信息,用来加快调试过程的速度。记录了程序有关的一些数据和调试信息。 .PLG:编译信息文件,编译时的error和warning信息文件。.RC:资源定义文件。.RC2:资源定义文件,供一些特殊情况下使用。 .REG:注册表信息文件。 .RES:二进制资源文件,资源编译器编译资源定义文件后即生成RES文件。 .RTF:Rich Text Format(丰富文本格式)文档,可由Word或写字板来创建,常被用来生成Help文件。 .SBR:VC编译器为每个OBJ文件生成的原始浏览信息文件,浏览信息维护工具(BSCMAKE)将利用SBR文件来生成BSC文件。 .TLB:OLE库文件,其中存放了OLE自动化对象的数据类型、模块和接口定义,自动化服务器通过TLB文件就能了解自动化对象的使用方法。debug 包里面有生成的可执行文件,及有关链接库的一些信息,调试信息等
个人分类: c++学习|2217 次阅读|0 个评论
[转载]C++读写二进制文件
depengchen 2013-10-12 20:37
摘要: 使用 C++ 读写二进制文件,在开发中操作的比较频繁,今天有幸找到一篇文章,遂进行了一些试验,并进行了部分的总结。 使用 C++ 操作文件,是研发过程中比较频繁的,因此进行必要的总结和封装还是十分有用的。今天在网上找到一篇,遂进行了部分的试验,以记之,备后用。 本文读写文件均使用文件流进行操作,主要使用的类是 ifstream, ofstream, 使用时,请务必包含文件 fstream 。如下: #include fstream 写二进制文件 写二进制文件应该使用 ofstream 类,文件的打开模式一定要是 binary ,如果传入的不是 binary, 文件将以 ASCII 方式打开。 下面是示例代码,用于写入文件。 std::ofstream fout(a.dat, std::ios::binary); int nNum = 20; std::string str(Hello, world); fout.write((char*)nNum, sizeof(int)); fout.write(str.c_str(), sizeof(char) * (str.size())); fout.close(); 而写文本文件则比较简单,如下: std::ofstream fout(b.dat); int nNum = 20; std::string str(Hello, world); fout nNum , str std::endl; fout.close(); 读二进制文件 读取二进制文件可以使用 ifstream 类来进行,文件的打开模式一定要是 binary ,如果传入的不是 binary, 文件将以 ASCII 方式打开。 下面是示例代码: std::ifstream fin(a.dat, std::ios::binary); int nNum; char szBuf = {0}; fin.read((char*)nNum, sizeof(int)); fin.read(szBuf, sizeof(char) * 256); std::cout int = nNum std::endl; std::cout str = szBuf std::endl; fin.close(); 而读取文本文件则比较简单: std::ifstream fin(b.dat); int nNum; char szBuf = {0}; fin nNum szBuf; std::cout int = nNum std::endl; std::cout str = szBuf std::endl; fin.close(); 文件的打开模式 文件操作时,如果不显示指定打开模式,文件流类将使用默认值。 在 fstream 中定义了如下打开模式和文件属性 : ios::app // 从后面添加 ios::ate // 打开并找到文件尾 ios::binary // 二进制模式 I/O (与文本模式相对 ) ios::in // 只读打开 ios::out // 写打开 ios::trunc // 将文件截为 0 长度 可以使用位操作符 OR 组合这些标志,比如 ofstream logFile(log.dat, ios::binary | ios::app); 二进制文件的复制 这里我实现了一个二进制文件的复制操作,用于验证读写的正确性,示例代码如下: view plain copy bool copy_binary_file(const char * szDestFile, const char * szOrigFile) { if (szDestFile == NULL) { return false; } if (szOrigFile == NULL) { return false; } bool bRet = true; std::ofstream fout(szDestFile, std::ios::binary | std::ios::app); std::ifstream fin(szOrigFile, std::ios::binary); if (fin.bad()) { bRet = false; } else { while(!fin.eof()) { char szBuf = {0}; fin.read(szBuf, sizeof(char) * 256); if (fout.bad()) { bRet = false; break; } // fout.write(szBuf, sizeof(char) * 256); } } fin.close(); fout.close(); return bRet; } 后记 由于文本文件本质上也是磁盘上的一个个二进制编码,因此,读写二进制文件的代码同样可以读写文本文件,在文件类型不是很明确的读写操作中,直接使用二进制读写比较可取,如果可以直接判断文件类型,则可以分别对待。 关于读取文本文件,请参照 http://blog.csdn.net/lightlater/archive/2011/04/15/6326338.aspx 参考文献: * 用 C++ 进行简单的文件 I/O 操作 ( http://www.vckbase.com/document/viewdoc/?id=1439 ) * 百度文库 ( http://wenku.baidu.com/view/9faa23db50e2524de5187eb3.html ) http://blog.csdn.net/lightlater/article/details/6364931
个人分类: 程序设计|0 个评论
4阶幻方与二进制表示的对称性
热度 2 primeacademy 2013-7-26 12:55
将 1 到 16 的自然数排成 4x4 的方阵,每行每列以及对角线上数的和等于 34 ,这样的方阵称为 4 阶幻方。南宋数学家杨辉是最早系统研究幻方的数学家,他将幻方命名为纵横图,给出了最高到 10 阶的幻方。下面介绍历史上有名的 4 届幻方,将这些幻方用二进制表示,则呈现出非常好的对称性。 ​ 问题: 1. 满足二进制中心对称或轴对称的 4 阶幻方还有哪些?全部确定的充分必要条件是什么? 2. 按照这样的对称性考虑更广泛的偶阶或奇阶幻方,是否可以得到一些有效的构造方法?
个人分类: 初中数学|16677 次阅读|7 个评论
幂集合的直观图式与二进制
primeacademy 2013-7-13 23:46
以下图式有很深刻的内涵,很多有名的问题(比如 EKR 问题与 Kneser 图等)蕴含其中 , 最为直观的是,自然数按照二进制的方式自然“生长”出来,如果 A 取全体自然数构成的集合,则这个图式似乎开始涉及连续统、形式幂级数,甚至非标准分析 . 正所谓“《易》有太极,是生两仪。两仪生四象。四象生八卦”,意蕴悠长!
个人分类: 大学数学|5636 次阅读|0 个评论
[转载]计算机中带符号的整数为何采用二进制的补码进行存储?
zhongzejiang 2013-7-11 12:31
我们都知道在计算机内部数据的存储和运算都采用二进制,是因为计算机是由很多晶体管组成的,而晶体管只有2种状态,恰好可以用二进制的0和1表示,并且采用二进制可以使得计算机内部的运算规则简单,稳定性高。在计算机中存在实数和整数,而整数又分为无符号整数和有符号整数,无符号的整数表示很简单,直接采用其二进制形式表示即可,而对于有符号数的表示却成了问题,如何表示正负?如何去处理正负号?下面来具体说下其中的原因,在这之前先了解一下原码、反码和补码这几个概念。 1.原码、反码和补码的概念   在了解原码、反码和补码之前先说一下有符号数和无符号数。用过C语言的都知道在C语言中用signed和unsigned来标识一个数是否是有符号还是无符号类型的。对于一个8bit的二进制来说,若当做无符号数处理,其能表示的整型值范围是0~255,但是这样表示数据就有个局限性,如果数据是负的该如何表示?因此就引入了有符号类型的概念,对于有符号类型,规定取最高位为符号位,若最高位为0,则为正数,否则为负数,这样一来对于8位二进制,示数值的就只有7位了,能够表示的非负数值范围变为0~127,负值范围为-127~-1,相当于可以理解为将无符号类型能够表示的128~255拿来去表示-127~-1了。事实上,在计算机内部存储中,计算机自己是无法去区分无符号还是有符号类型的,对于255和-1,在计算机内部存储的都是11111111。换个角度来说,如果事先知道内存中存储了这样一个8位二进制11111111,但是谁也不能肯定它具体表示什么数值,是-1还是255?这个是需要靠程序员自己去指定的,如果指定为无符号类型,则编译器则通过相应指令将其转换为数值255。事实上对于-x的二进制补码表示形式和(256-x)(256-x当做无符号类型处理)的二进制表示形式相同,从这里可以略微了解了补码的含义了。在教材中对于原码、反码以及补码一般是这么定义的:   对于正数原码、反码以及补码是其本身。负数的原码是其本身,反码是对原码除符号位之外的各位取反,补码则是反码加1。   因为(-x)的二进制补码形式和256-x的二进制表示形式相同,而255-x相当于对x的每一位取反,那么256-x就是255-x后加1。   注意:1)原码、反码、补码的概念是针对有符号类型而言的。      2)实数始终是有符号类型的(实数并不是采用补码形式存储的,具体可参考《 浅谈C/C++的浮点数在内存中的存储方式 》一文),整型数据包括无符号和有符号类型的。 2.采用补码表示带符号的整数的原因   对于有符号类型的整数,有原码、反码和补码三种形式,最后选择了补码来表示,具体来说有下面几点原因。   1)能够统一+0和-0的表示   采用原码表示,+0的二进制表示形式为0 000 0000,而-0的二进制表示形式为1 000 0000;   采用反码表示,+0的二进制表示形式为0 000 0000,而-0的二进制表示形式为1 111 1111;   采用补码表示,+0的二进制表示形式为0 000 0000,而-0的二进制表示形式为1 111 1111+1=1 0000 0000,因为计算机会进行截断,只取低8位,所以-0的补码表示形式为0000 0000。   从上面可以看出只有用补码表示,+0和-0的表示形式才一致。正因为如此,所以补码的表示范围比原码和反码表示的范围都要大,用补码能够表示的范围为-128~127,0~127分别用00000000~01111111来表示,而-127~-1则用10000001~11111111来表示,多出的10000000则用来表示-128。因此对于任何一个n位的二进制,假若表示带符号的整数,其表示范围为-2^(n-1)~2^(n-1)-1,且有MAX+1=MIN。看下面一段代码: char ch= 127 ; ch++;   ch的值是多少?它的值是-128,读者可以上机验证一下。   假如不采用补码来表示,那么计算机中需要对+0和-0区别对待,显然这个对于设计来说要增加难度,而且不符合运算规则。   2)对于有符号整数的运算能够把符号位同数值位为一起处理   由于将最高位作为符号位处理,不具有实际的数值意义,那么如何在进行运算时处理这个符号位?如果单独把符号位进行处理,显然又会增加电子器件的设计难度和CPU指令设计的难度,但是采用补码能够很好地解决这个问题。下面举例说明:   比如-2+3=1   如果采用原码表示(把符号位同数值位一起处理):   1 000 0010+0 000 0011=1 000 0101=(-5) 原 ,显然这个结果是错误的。   如果采用反码表示   1 111 1101+0 000 0011=1 0000 0000=0 0000000=(+0) 反 ,显然这个结果也是错误的。   如果采用补码表示   1 111 1110+0 000 0011=1 0000 0001=0000 0001=(1) 补 ,结果是正确的。   从上面可以看出,当把符号位同数值位一起进行处理时,只有补码的运算才是正确的。如果不把符号位和数值位一起处理,会给CPU指令的设计带来很大的困难,如果把符号位单独考虑的话,CPU指令还要特意对最高位进行判断,这个对于计算机的最底层实现来说是很困难的。   3)能够简化运算规则   对于-2+3=1这个例子来说,可以看作是3-2=1,也即 + =1,从上面的运算过程可知采用补码运算相当于是    补 + 补= 补, 也即可以把减法运算转换为加法运算。这样一来的好处是在设计电子器件时,只需要设计加法器即可,不需要单独再设计减法器。   总的来说,采用补码主要有以上几点好处,从而使得计算机从硬件设计上更加简单以及简化CPU指令的设计。 测试代码 #includestdio.h int main( void ) { char ch=- 1 ; char *p=( char *)ch; unsigned char uch=*p; printf( %d\n ,uch); // 输出结果为255 return 0 ; } 作者: 海子      出处: http://www.cnblogs.com/dolphin0520/      本博客中未标明转载的文章归作者 海子 和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
2164 次阅读|0 个评论
[转载]二进制、八进制、十进制、十六进制之间转换
EnergeticYi 2013-6-30 10:28
一、 十进制与二进制之间的转换 (1) 十进制转换为二进制,分为整数部分和小数部分 ① 整数部分 方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数读起,一直到最前面的一个余数。下面举例: 例:将十进制的168转换为二进制 得出结果 将十进制的168转换为二进制,(10101000)2 分析:第一步,将168除以2,商84,余数为0。 第二步,将商84除以2,商42余数为0。 第三步,将商42除以2,商21余数为0。 第四步,将商21除以2,商10余数为1。 第五步,将商10除以2,商5余数为0。 第六步,将商5除以2,商2余数为1。 第七步,将商2除以2,商1余数为0。 第八步,将商1除以2,商0余数为1。 第九步,读数,因为最后一位是经过多次除以2才得到的,因此它是最高位,读数字从最后的余数向前读,即10101000 (2) 小数部分 方法:乘2取整法,即将小数部分乘以2,然后取整数部分,剩下的小数部分继续乘以2,然后取整数部分,剩下的小数部分又乘以2,一直取到小数部分 为零为止。如果永远不能为零,就同十进制数的四舍五入一样,按照要求保留多少位小数时,就根据后面一位是0还是1,取舍,如果是零,舍掉,如果是1,向入一位。换句话说就是0舍1入。读数要从前面的整数读到后面的整数,下面举例: 例1:将0.125换算为二进制 得出结果:将0.125换算为二进制(0.001)2 分析:第一步,将0.125乘以2,得0.25,则整数部分为0,小数部分为0.25; 第二步, 将小数部分0.25乘以2,得0.5,则整数部分为0,小数部分为0.5; 第三步, 将小数部分0.5乘以2,得1.0,则整数部分为1,小数部分为0.0; 第四步,读数,从第一位读起,读到最后一位,即为0.001。 例2,将0.45转换为二进制(保留到小数点第四位) 大家从上面步骤可以看出,当第五次做乘法时候,得到的结果是0.4,那么小数部分继续乘以2,得0.8,0.8又乘以2的,到1.6这样一直乘下去,最后不可能得到小数部分为零,因此,这个时候只好学习十进制的方法进行四舍五入了,但是二进制只有0和1两个,于是就出现0舍1入。这个也是计算机在转换中会产生误差,但是由于保留位数很多,精度很高,所以可以忽略不计。 那么,我们可以得出结果将0.45转换为二进制约等于0.0111 上面介绍的方法是十进制转换为为二进制的方法,需要大家注意的是: 1) 十进制转换为二进制,需要分成整数和小数两个部分分别转换 2) 当转换整数时,用的除2取余法,而转换小数时候,用的是乘2取整法 3) 注意他们的读数方向 因此,我们从上面的方法,我们可以得出十进制数168.125转换为二进制为10101000.001,或者十进制数转换为二进制数约等于10101000.0111。 (3) 二进制转换为十进制 不分整数和小数部分 方法:按权相加法,即将二进制每位上的数乘以权,然后相加之和即是十进制数。例 将二进制数101.101转换为十进制数。 得出结果:(101.101)2=(5.625)10 大家在做二进制转换成十进制需要注意的是 1) 要知道二进制每位的权值 2) 要能求出每位的值 二、 二进制与八进制之间的转换 首先,我们需要了解一个数学关系,即23=8,24=16,而八进制和十六进制是用这 关系衍生而来的,即用三位二进制表示一位八进制,用四位二进制表示一位十六进制数。 接着,记住4个数字8、4、2、1(23=8、22=4、21=2、20=1)。现在我们来练习二进制与八进制之间的转换。 (1) 二进制转换为八进制 方法:取三合一法,即从二进制的小数点为分界点,向左(向右)每三位取成一位,接着将这三位二进制按权相加,得到的数就是一位八位二进制数,然后,按顺序进行排列,小数点的位置不变,得到的数字就是我们所求的八进制数。如果向左(向右)取三位后,取到最高(最低)位时候,如果无法凑足三位,可以在小数点最左边(最右边),即整数的最高位(最低位)添0,凑足三位。例 ①将二进制数101110.101转换为八进制 得到结果:将101110.101转换为八进制为56.5 ② 将二进制数1101.1转换为八进制 得到结果:将1101.1转换为八进制为15.4 (2) 将八进制转换为二进制 方法:取一分三法,即将一位八进制数分解成三位二进制数,用三位二进制按权相加去凑这位八进制数,小数点位置照旧。例: ① 将八进制数67.54转换为二进制 因此,将八进制数67.54转换为二进制数为110111.101100,即110111.1011 大家从上面这道题可以看出,计算八进制转换为二进制 首先,将八进制按照从左到右,每位展开为三位,小数点位置不变 然后,按每位展开为22,21,20(即4、2、1)三位去做凑数,即a×22+ b×21 +c×20=该位上的数(a=1或者a=0,b=1或者b=0,c=1或者c=0),将abc排列就是该位的二进制数 接着,将每位上转换成二进制数按顺序排列 最后,就得到了八进制转换成二进制的数字。 以上的方法就是二进制与八进制的互换,大家在做题的时候需要注意的是 1) 他们之间的互换是以一位与三位转换,这个有别于二进制与十进制转换 2) 大家在做添0和去0的时候要注意,是在小数点最左边或者小数点的最右边(即整数的最高位和小数的最低位)才能添0或者去0,否则将产生错误 三、 二进制与十六进制的转换 方法:与二进制与八进制转换相似,只不过是一位(十六)与四位(二进制)的转换,下面具体讲解 (1) 二进制转换为十六进制 方法:取四合一法,即从二进制的小数点为分界点,向左(向右)每四位取成一位,接着将这四位二进制按权相加,得到的数就是一位十六位二进制数,然后,按顺序进行排列,小数点的位置不变,得到的数字就是我们所求的十六进制数。如果向左(向右)取四位后,取到最高(最低)位时候,如果无法凑足四位,可以在小数点最左边(最右边),即整数的最高位(最低位)添0,凑足四位。 ①例:将二进制11101001.1011转换为十六进制 得到结果:将二进制11101001.1011转换为十六进制为E9.B ② 例:将101011.101转换为十六进制 因此得到结果:将二进制101011.101转换为十六进制为2B.A (2)将十六进制转换为二进制 方法:取一分四法,即将一位十六进制数分解成四位二进制数,用四位二进制按权相加去凑这位十六进制数,小数点位置照旧。 ①将十六进制6E.2转换为二进制数 因此得到结果:将十六进制6E.2转换为二进制为01101110.0010即110110.001 四、八进制与十六进制的转换 方法:一般不能互相直接转换,一般是将八进制(或十六进制)转换为二进制,然后再将二进制转换为十六进制(或八进制),小数点位置不变。那么相应的转换请参照上面二进制与八进制的转换和二进制与十六进制的转 五、八进制与十进制的转换 (1)八进制转换为十进制 方法:按权相加法,即将八进制每位上的数乘以位权,然后相加之和即是十进制数。 例:①将八进制数67.35转换为十进制 (2)十进制转换为八进制 十进制转换成八进制有两种方法: 1)间接法:先将十进制转换成二进制,然后将二进制又转换成八进制 2)直接法:前面我们讲过,八进制是由二进制衍生而来的,因此我们可以采用与十进制转换为二进制相类似的方法,还是整数部分的转换和小数部分的转换,下面来具体讲解一下: ①整数部分 方法:除8取余法,即每次将整数部分除以8,余数为该位权上的数,而商继续除以8,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数起,一直到最前面的一个余数。 ②小数部分 方法:乘8取整法,即将小数部分乘以8,然后取整数部分,剩下的小数部分继续乘以8,然后取整数部分,剩下的小数部分又乘以8,一直取到小数部分为零为止。如果永远不能为零,就同十进制数的四舍五入一样,暂取个名字叫3舍4入。 例:将十进制数796.703125转换为八进制数 解:先将这个数字分为整数部分796和小数部分0.703125 整数部分 小数部分 因此,得到结果十进制796.703125转换八进制为1434.55 上面的方法大家可以验证一下,你可以先将十进制转换,然后在转换为八进制,这样看得到的结果是否一样 六、十六进制与十进制的转换 十六进制与八进制有很多相似之处,大家可以参照上面八进制与十进制的转换自己试试这两个进制之间的转换。 通过上面对各种进制之间的转换,我们可以将前面的转换图重新完善一下: 本文介绍了二进制、十进制、八进制、十六进制四种进制之间相互的转换,大家在转换的时候要注意转换的方法,以及步骤,特别是十进制转换为期于三种进制之间,要分为整数部分和小数部分,最后就是小数点的位置。但是要保证考试中不出现错误还是需要大家经常练习,这样才能熟能生巧。
1 次阅读|0 个评论
庄子、二进制与区间套
热度 26 gfcao 2013-3-15 10:22
标题看起来有点牛头不对马嘴,庄子与二进制有何相干?二进制与区间套又有几毛钱关系?稍安勿躁,且听我慢慢道来。 《庄子.天下篇》曰:“一尺之棰,日取其半,万世不竭。”庄子的话充分说明很久以前我们的老祖宗就有着深刻的极限思想了。我们可以用二进制来表示庄子这句话,一尺之棰可以抽象为单位长度,例如可以看成单位区间 ,日取其半,即每天切下来一半,也就是说,第一天将 区间二等分,去其中之一,不妨取 。第二天再将 二等分,取其一半,还是取右边那个,即 。依次类推,第 n 天留下了 。所谓万世不竭,也只是有限天,就算一世一百年,一万世是一百万年,一年三百六十五天,可以算出,一万世之后尚留下了长度为 1/$2^365000000$ 区间 。如果用十进制小数来表达这个区间的左端点会把人算死,但如果用二进制来计算就很简单了, $1/2+\cdots+1/$2^365000000$=0.11\cdots 1$ (共有 365000000 位 1 )。如果我们学习愚公移山的精神,将这根木棍当成传家宝,子子孙孙无穷尽地砍下去,最终得到了一个无穷小数 $0.111111111\cdots $ 。这个小数是谁?在微积分理论产生之前,这个数如同幽灵般飘忽不定。芝诺与他的老师门巴尼德甚至拿这些数来相互嘲笑: 1 大于 $0.999\cdots $ 还是小于 $0.999\cdots $ ? 在这个分割的过程中,我们得到了一个区间套 $\{ \}$ ,由区间套定理,这些区间有唯一的交点 1 ,换句话说,区间的左端点 $1/2+\cdots+1/2^{n}$ 以 1 为极限。对于熟悉微积分的人当然知道级数 $\sum_{n=1}^{\infty }a^{n}$ 在 $|a|1$ 时是收敛的, $a=1/2$ 也不例外。 芝诺悖论的产生说明在古希腊时期就有极限思想的萌芽,只是人们说不清楚,一个无限小数是什么意思?在那时是无法理解的。即使在今天,如果你仅仅知道一些概念,而并不理解极限思想的本质,你一样无法理解为什么阿基里斯能够追上乌龟。当然,物理学家可以从物理学层面上理解芝诺悖论,哲学家可以从哲学层面上理解芝诺悖论。数学家理解芝诺悖论当然离不开极限。事实上,正如应行仁老师指出的,芝诺悖论的出现实际上是对极限的认识与理解问题,也即它是个数学问题,说它是个数学游戏并不为过。 我觉得古希腊数学家解释不了芝诺悖论不奇怪,但今天的微积思想是完全可以解释清楚的。至于是不是涉及到量子理论,可能是量子学家们的事情。我们生活在现实的时空中,直觉与经验告诉我们,时空是连续的。当然物理学家可以说时空不连续,这是个认识论问题,就好比你可以不承认欧氏几何的公设,或者说空间不是平直的,完全可以另起炉灶建立起一套“另类”的几何。 芝诺悖论暗含着深刻的逻辑问题,即形式逻辑与辩证逻辑的冲突,我们不妨来分析一下芝诺悖论中的逻辑问题。按照人们的经验,阿基里斯在通常的时间尺度下可以在有限的时间内追上乌龟,但芝诺将阿基里斯的运动路线进行了分割,我们不妨简化并抽象化一下芝诺的分割方法。假设一个人在一秒钟内可以从 1 走到 0 ,现在将区间 用 $\{1/n\}$ 来分割,这个人从 1 走到 0 之前必先走到 1/2 ,从 1/2 走到 0 之前,一定要经过 1/3 ,以此类推,无限次走下去,这个人始终走不到 0 点。从逻辑上讲,这里偷换了概念或时间尺度,把有限的时间 1 秒换成了无限的分割 $\{1/n\}$ 。诚然,这里涉及时间的无限可分性,不是数学家可以解决的问题,但从数学上看,区间 是可以无限分割的,要让这个人走到 0 ,就必须让他经过所有的 $1/n$ ,也就是说,需要让 n$\arrow \infty$ ,于是将出现 $1/\infty =0$ ,这在形式逻辑中是不允许的。这正是为什么形式逻辑解释不了芝诺悖论的原因。 如果你不承认微积分,自当用别的方法去寻求解释,可是,芝诺悖论本来就是微积思想的产物,该用什么理论来解释这个悖论似乎不是个问题。
个人分类: 数学常识|9571 次阅读|79 个评论
大将军数学题二-答案
热度 12 tianrong1945 2013-3-7 09:09
大将军数学题二-答案
大将军的数学题 2-及答案 1. ==== 书有多少页 ==== 一本书有 N 页厚。书的页数是从 1 到 N 。所知道的是,所有的页数总共用了 1095 个数码字。请问这本书有多少页? 答案: 401 页 解释:有 9 页个位数的书页,每页用一个数码字。 90 页两位数的书页,每页用 2 个数码字。首先假设没有四位数的书页,而三位数书页的数目为 x 。因为总共用了 1095 个数字,所以列出 x 的方程: 9+2*90+3*x=1095 。解出 x=302 ,总的书页数 =302+9+90=401 2. ==== 导火索 ==== 有两根导火索,它们的长度都是正好 1 分钟烧完。但是它们燃烧的速度是不均匀的。也就是说,你不能用一小段的长度与总长度的比值来确定燃烧完这一小段的时间。 用这两根导火索和一只打火机,没有其它计时器的帮助,请你给我报告两次时间信号:开始的时间 t1 、结束的时间 t2 。时间 t1 和 t2 准确地相差 45 秒。 答案:将其中一根的两头,以及另一根的一头,同时点燃,这个时刻定为 t1 。当第一根烧完时,立即后点燃第二根的另一端,第二根烧完的时刻便是 t2 。 解释,见下图:第一根两头点燃,直到烧完,时间是 30 秒。这时第二根也烧了 30 秒,因第二根只点了一端,因而只烧完了一半时间,剩下的部分还能烧 30 秒,这时马上点燃它的另一端,变成从两头同时烧,因而烧完的时间是 15 秒,加上开始的 30 秒,总共历时 45 秒。 3. ==== 计时沙漏 ==== 沙漏( hourglass )是最早使用的计时仪器之一。如下图( a )中所示的沙漏,是上下对称的,可以倒来倒去地计时。比如说,如果有一个 2 分钟的沙漏,你便可以漏一次得到 2 分钟,漏完后立即倒过来,再漏完,总共得到 4 分钟的时间。 现在,给你一个 4 分钟的沙漏,和一个 7 分钟的沙漏,它们都是可以倒来倒去的对称沙漏。如何将它们配合使用,才能得到准确的、从开始到结束总共 9 分钟的时间? 用图形,我们可以更方便地说明这个问题。一个沙漏某时刻的状态可以用上下重叠的两个带数字的方格表示,例如,上图( b )所表示的是 7 分钟沙漏的初始状态和漏了 2 分钟后的状态。上图中的( c )则是要请你回答的问题。 答案: 解释: 设 7 分钟的沙漏为 A , 4 分钟的为 B , A , B 同时漏, 4 分钟后, 状态为 ( A : 3 , 4 );( B : 0 , 4 ); B 倒过来, 3 分钟 A 漏完全后, 状态为( A : 0 , 7 ); ( B : 1 , 3 ); A 倒过来, 1 分钟 B 漏完全后, 状态为( A : 1 , 6 ); ( B : 0 , 4 ), A 倒过来 , 1 分钟后, 状态为( A : 0 , 7 ); 4. ==== 测量砖头的对角线 ===== 这是一个有趣的的有切实可行解决办法的几何问题: 单凭三个砖块和一把尺子,不使用任何公式,怎样才能测量一个砖头的立体对角线?就是穿过砖头内部的那条对角线。 答案:将三块砖头如图迭起来,就可测量。 5. ==== 方 格子 ===== 有一张 8 × 8=64 个格子的格子纸,右上角和左下角各被剪去一格,如图左所示: 女儿有 31 张长方形的卡片(中图),每张刚好是两个格子。女儿想:剪掉了两个角的格子纸面积和 31 张卡片总面积一样大,因此,她想用卡片作拼图,把格子纸盖起来,但她拼来拼去都不成功,你能帮帮她吗?或者…… 答案:不可能覆盖起来。 解释:不是面积相等就能覆盖的!女儿难不倒将军。不过, 8 岁的女儿不懂高深的数学,将军想了一个巧妙的方法解释给她听。他将 8 × 8 的格子纸涂成黑白相间的国际象棋棋盘(下左图),又举了 2 × 2 方格纸剪去两角为例。看下面右图,剪去的两个小方块都是黑色的,剩下两个白方块处于对角的位置,怎么可能被一个黑白的卡片覆盖呢?图中一目了然,小女儿很快就明白了。 6. ==== 电路 ===== 12 个电阻连成一个正立方体,正方体的每一条棱上有一个 1 欧姆的电阻,请你求出 A 和 E 之间的 等效电阻。 答案: 5/6 。 解释: 解此题的巧妙之处是在于利用对称性,和电学的一丁点儿基础概念,否则…… 见下左图,三个红点的电位应该相同,三个绿点的电位也应该相同。电位相同的点等效于连在一起。 下图中,左、右的电路是互相等效的,因此: R = 1/3 + 1/6 + 1/3 , R = 5/6 。 7. 附加题 ==== 老鼠和毒药 ===== 有 100 只一模一样的瓶子,编号 1-100 。其中 99 瓶是水,一瓶是看起来像水的毒药。只要老鼠喝下一小口毒药,一天后则死亡。现在,你有 7 只老鼠和一天的时间,如何检验出哪个号码瓶子里是毒药? 答案: 首先,将瓶子的 10 进制编号数改成 7 位的 2 进制码。然后,让第 1 只老鼠喝所有 2 进制码第 1 位是 1 的瓶子中的水;让第 2 只老鼠喝所有 2 进制码第 2 位是 1 的瓶子中的水;以此类推下去。这样,每个老鼠第二天的死活情况就决定了毒水瓶子二进制码这一位的数字:老鼠死,对应 1 ,反之为 0 。
12751 次阅读|16 个评论
[转载]【Fortran】Fortran文件函数:Open close write read
zhenghui2915 2012-10-14 21:01
[转载]【Fortran】Fortran文件函数:Open close write read
转载地址: http://blog.163.com/jey_df/blog/static/182550161201221511219329/ 1.文件读取的概念: 读取:“顺序读取”和“直接读取”。 保存:“文本文件”和“二进制文件”。 二进制文件:读取快,因为保存格式和数据在内存中的保存方法一样,同时也节省空间。 ---------------------------------- 2. 文件的操作: ---------------------------------- open的使用 : 使用open命令打开文件之后,就可以对文件来做输入输出。 example: program ex0901 impicit none open(unit=10, file='hello.txt') ! 打开hello.txt文件, unit指定文件代码,file指定文件名称。 write(10, *) "hello" !在代码为10的文件中写入hello stop end program ex0901 open中有很多参数可以使用,详细如下: OPEN(UNIT=number, FILE='filename', FORM='...', STATUS='...', ACCESS='...', RECL=length, ERR=label, IOSTAT=iostat, BLANK='...', POSITION='...', ACTION=action, PAD='...', DELIM='...') UNIT= 'number': number必须是一个正整数,它可以使用变量或是常量来赋值。number最好避开1,2,5,6。因为2,6是默认的输出位置,也就是屏幕。1,5则是默认的输入位置,键盘。 FILE= 'filename': 指定要打开的文件名称,文件名要符合系统规定。windows下不区分大小写,unix下则会区分大小写,最好不要使用中文文件名。 FORM ='FORMATTED' OR 'UNFORMATTED' FORM字段只有两个值可以设置: FORM='FORMATTED' “文本文件”格式来保存 FORM='UNFORMATTED' “二进制文件”格式保存 这一栏不给定时候的默认值是: FORM='FORMATTED' STATUS ='NEW' or 'OLD' or 'SCRATCH' or 'UNKNOWN' 用来说明打开一个新的文件或已经存在的旧文件。 STATUS='NEW' 打开一个原本不存在的新文件 STATUS='OLD' 打开一个原来已经存在的文件 STATUS='REPLACE' 若文件已经存在则重新创建一次,原来的内容消失;若不存在则会创建新文件。 STATUS='SCRATCH' 表示要打开一个暂存文盘,这个时候可以不需要指定文件名称,也就是FILE这个一栏可以忽略。因为程序本身会自动取一个文件名,至于文件名是啥也不重要,因为暂存盘会在程序结束后自动删除。 STATUS='UNKNOWN' 由各编译器自定义。通常会同REPLACE的效果。 !这一栏不给定时,默认为STATUS='UNKNOWN'。 ACCESS ='SEQUENTIAL' or 'DIRECT' 设置读写文件的方法: ACCESS='SEQUENTIAL' 读写文件的操作会以“顺序”的方法来做读写,“顺序读取文件”。 ACCESS='DIRET' 读写文件的操作可以任意指定位置,“直接读取文件”。 !不赋值时候,默认为: ACCESS='SEQUENTIAL'。 RECL =length 在顺序读取文件中,RECL字段值用来设置一次可以读取多大容量的数据。 打开“直接读取文件”,RECL=length的length值是用来设置文件中每一个模块单元的分区长度。 length的单位在文本根式下为1个字符,也就是1 byte。在二进制格式下则由编译器自行决定,一般可能为1 byte (G77) 或 4 byte (Visual Fortran)。 ERR=LABEL 这个字段用来设置当文件打开发生错误时,程序会跳跃到LABEL所指定的行代码处来继续执行程序。 IOSTAT=var 这个字段会设置一个整数值给后面的整型变量,这是用来说明文件打开的状态,数值会有下面三种情况: var0 表示读取操作错误 var=0 表示读取操作正常 var0 表示文件终了 判断文件是否读取结束的方法: F90/95 大概这样 do read(..., iostat=ios,...) if (ios /= 0) exit end do F77 大概是这样 read(...,end=10,...) ... 10 .... 实例:读取如下文件 Fortran源码: ! ReadFileTOend.f90 ! ! FUNCTIONS: ! ReadFileTOend - Entry point of console application. ! program ReadFileTOend implicit none ! Variables real*8 longitude,latitude real*8 x,y,z integer*4 ios open(10,file='ins_error.dat',status='old') write(*,*)'Open file Success !' write(*,*)"The first Method:" do read(10,*,iostat=ios) longitude,latitude,x,y,z if(ios/=0) exit !0 表示正常读取文件 0 读取出错 0 读取结束 write(*,99)longitude,latitude,x,y,z enddo 99 format(5f15.8) rewind(10) write(*,*)"The second Method:" do read(10,*,end=100)longitude,latitude,x,y,z write(*,"(5f15.8)")longitude,latitude,x,y,z end do 100 continue ! Body of ReadFileTOend print *, 'Read file to the end!' end program ReadFileTOend 运行结果: 源代码下载: ReadFileTOend.rar BLANK ='NULL' or 'ZERO' 用来设置输入数字时,当所设置的格式字段中有空格存在时所代表的意义。 BLANK='NULL'时,空格代表没有东西。BLANK='ZERO'时,空格部分会自动以0代入。 以下是Fortran 90添加的功能: POSITION ='ASIS' or 'REWIND' or 'APPEND' 设置文件打开时候的读写位置: POSITION='ASIS' 表示文件打开时的读取的位置不特别指定,通常就是在文件的开头。是默认值。 POSITION='REWIND' 表示文件打开时的读取位置移到文件的开头。 POSITION='APPEND' 表示文件打开时的读取位置移到文件的结尾。 ACTION ='READ' or 'WRITE' or 'READWRITE' 设置打开文件的读写权限: ACTION='READWRITE' 表示所打开的文件可以用来读取及写入,这是默认值。 ACTION='READ' 表示所打开的文件只能用来读取数据。 ACTION='WRITE' 表示所打开的文件只能用来写入数据。 PAD ='YES' or 'NO' PAD='YES' 在格式化输入时,最前面的不足字段会自动以空格填满,默认值是PAD='YES'。 PAD='NO' 在格式化输入时,不足的字段不会自动以空格填满。 DELIM ='APOSTEROPHE' or 'QUOTE' or 'NONE' DELIM='NONE' 纯粹输出字符串内容 DELIM='QUOTE' 输出字符串内容会在前后加上 双引号 DELIM='APOSTEROPHE' 输出字符串内容会在前后加上单引号 ----------------------------------------- WRITE READ 的使用(详细): WRITE/READ(UNIT=number, FMT=format, NML=namelist, REC=record, IOSTAT=stat, ERR=errlabel, END=endlabel, ADVANCE=advance, SIZE=size) UNIT=number 指定read/write所使用的输入输出的位置。 FMT=format 指定输入输出格式的使用。 NML=namelist 指定读写某个NAMELIST的内容(后续介绍)。 REC=record 在直接读取文件中,设置所要读写的文件的模块位置。 IOSTAT=stat 会设置一个数值给在它后面的变量,用来说明文件的读写状态。 stat0 表示读取操作发生错误。 stat=0 表示读取操作正常。 stat0 表示文件终了。 ERR=errlabel 指定在读写过程中发生错误时,会转移到某个行代码来继续执行程序。 END=endlabel 指定在读写到文件末尾时,要转移到某个行代码来继续执行程序。 以下是fortran 90添加功能: ADVANCE='YES' or 'NO' 设置在文本格式下的顺序文件中,每一次的READ,WRITE命令完成后, 读写 位置会不会自动想下移动一行。 ADVANCE='YES' 是默认的状态,每读写一次会向下移动一行。 ADVANCE='NO' 会暂停自动换行的操作。 !使用这个字段时候一定要设置输出入格式,在屏幕输出时可以使用这个设置来控制write命令是否会自动换行。 SIZE=count 在ADVANCE='NO'时,才可以使用这个字段。它会把这一次输出入的字符数目设置给后面的整型变量。 ---------------------------------- 查询文件的状态INQUIRE: 在使用open打开文件的前后,都可以通过inquire命令来查询文件目前的情况,inquire命令中的各个字段和第一小节中open的字段很类似。 example: !检查某个程序是否存在 program ex0903 implicit none character(len=20) :: filename = "ex0903.f90" logical alive inquire(file=filename, exist=alive) if(alive) then write (*, *) filename, " exist." else write (*, *) filename, "doesn't exist." end if stop edn program ex0903 详细介绍inquire的使用方法: INQUIRE(UNIT=number, FILE=filename, IOSTAT=stat, ERR=label, EXIST=exist, OPENED=opened, NUMBER=number, NAMED=named, ACCESS=access, SEQUENTIAL=sequential, DIRECT=direct, FORM=form, FORMATTED=formatted, UNFORMATTED=unformatted, RECL=recl) UNIT=number 文件代号 FILE=filename 文件名 IOSTAT=stat 查询文件读取情况,会设置一个整数给后面的变量: stat0 文件读取操作错误 stat=0 文件读取操作正常 stat0 文件终了 ERR=errlabel 发生错误时会转移到复制的代码行继续执行程序。 EXIST=exist 检查文件是否存在,返回布尔变量,真表示存在,假值表示不存在。 OPEND=opened 检查文件是否用已经用open打开,返回布尔变量,真表示已经打开,假表示尚未打开。 NUMBER=number 用文件名来查询这个文件所给定的代码。 NAMED=named 查询文件是否取了名字,也就是检查文件是否为临时保存盘,返回值为逻辑数。 ACCESS=access 检查文件的读取格式,返回一个字符串,可以是: 'SEQUENTIAL' 代表文件使用顺序读取格式 'DIRECT' 代表文件使用直接读取格式 'UNDEFINED' 代表没有定义 SEQUENTIAL=sequential 查看文件是否使用顺序格式,会返回一个字符串,可以是: 'YES' 代表文件是顺序读取文件 'NO' 代表文件不是顺序读取文件 'UNKNOWN' 代表不知道 DIRECT=direct 查看文件是否使用直接格式,会返回一个字符串,可以是: 'YES' 文件是直接读取文件 'NO' 文件是非直接读取文件 'UNKNOWN' 代表不知道 FORM=form 查看文件的保存方法,返回字符串,可以是: 'FORMATTED' 打开的是文本文件 'UNFORMATTED' 打开的是二进制文件 'UNDEFINED' 没有定义 FORMATTED=fmt 查看文件是否是文本文件,返回字符串,可以是: 'YES' 本文件是文本文件 'NO' 本文件非文本文件 'UNDEFINED' 无法判断 UNFORMATTED=fmt 查看文件是否是二进制文件,返回字符串,可以是: 'YES' 本文件是二进制文件 'NO' 本文件非二进制文件 'UNKNOWN' 无法判断 RECL=length 返回open文件时recl栏的设置值。 NEXTREC=nr 返回下一次文件读写的位置。 BLANK=blank 返回值是字符串,用来查看open文件时的blank参数所给定的字符串值。 以下是fortran 90的添加功能: POSITION=position 返回打开文件时position字段所给定的字符串, 可能是'REWIND', 'APPEND', 'ASIS', 'UNDEFINED' ACTION=action 返回打开文件时action 字段所赋值的字符串,可能是'READ', 'WRITE', 'READWRITE'。 READ=read 返回字符串,检查文件是否为只读文件: 'YES' 文件是只读的 'NO' 文件不是只读的 'UNKNOWN' 无法判断 WRITE=write 返回一个字符串,检查文件是否可写入: 'YES' 文件可以写入 'NO' 文件不可以写入 'UNKNOWN' 无法判定 READWRITE=readwrite 返回一个字符串,检查文件是否可以同时读及写: 'YES' 文件可以同时读写 'NO' 文件不可以同时读写 'UNKNOWN' 无法判定 DELIM=delim 返回打开文件时,DELIM字段所设置的字符串,返回值可以是: 'APOSTROPHE', 'QUOTE', 'NONE', 'UNDEFINED' PAD=pad 返回打开文件时PAD字段所设置的字符串,返回值可以是:'YES', 'NO'。 其他文件运行命令: 1.BACKSPACE (UNIT=number, ERR=errlabel, IOSTAT=iostat) 把文件读写位置退回一步。 2.ENDFILE (UNNIT=number, ERR=errlabel, IOSTAT=iostat)使用这个命令会把目前文件的读写位置变成文件的结尾。 3.REWIND (UNIT=number, ERR=errlabel, IOSTAT=iostat)把文件的读写位置倒回到文件开头。 4.CLOSE (UNIT=number, STATUS=string, ERR=errlabel, IOSTAT=) 把文件关闭,不要进行读写操作。 5.STAT ='KEEP' 会在文件关闭后,保留这个文件。是默认状态。 6.STAT ='DELETE' 在文件关闭后,消除这个文件。 7.顺序文件 (SEQUENTIAL): 在读写时,不能任意赋值到文件的某个位置读写数据,只能从开头开始一步步向下进行。在改变文件读写位置时,只能一步步地退,或是直接移回到文件开头。 直接访问文件:把文件的空间,内容,事先分区成好几个同样大小的小模块,这些模块会自动安顺序编号。读写文件时,要先赋值文件读写位置在第几个模块,再进行读写的工作。直接访问文件可以任意到文件的任何一个地方来读写。在使用直接访问文件时,要小心使用endfile命令,使用这个命令会把目前所在的文件位置之后的数据都清除掉。 8.二进制文件 的操作 :使用二进制文件来做直接读取时,open命令中的recl字段所设置的整数n值所代表的大小会随编译器不同而改变。每个编译器应该都可以经过设置来改变recl字段的单位大小。二进制文件没有必要在数据之间用区分符号来增加文件的可读性,因为二进制文件本身就没有可读性。二进制文件是直接把内存的二进制数据写入文件,就没有所谓的格式化输入/出存在。存放“精确”及“大量”的数据时,使用二进制文件是比较好的选择。二进制文件也可以使用顺序格式来操作,顺序格式下显示来的二进制文件,每个数据的前后都会被编译器补上一些额外的信息,所生成的文件不太容易被其他程序读取。 关于以上文件操作详细见《fortran 95程序设计》9-3~9-5。 ------------------------------------------- !程序结束时候会自动关闭文件,不过最好要养成自己关闭文件的习惯。 !在读文件的时候要懂得略掉一些没有必要的数据,如文件中的注释行。 !自由格式的数据文件读取(可以先读入前面的判断字符,结合select case或其他方法判断读入的数据) !在open,read,write时使用不同的unit值,就可以打开多个文件。最好不要同时打开很多个文件。 Internal File (内部文件) 使用写入文件的方法,把数据写到一个字符串变量中。 example: a=2 b=3 character (len=20) :: string write (unit=string, fmt="(I2,'+',I2,'=',I2)") a, b, a+b !把字符串变量当作输出的目的。 write(*, *) string 结果: 2+ 3= 5 还可以经过read命令从字符串读入数据: integer :: a character (len=20) :: string="123" read(string, *) a write(*, *) a 在某些情况下需要使用内部文件来设置数据: 使用read命令从键盘输入数据时,如果用户输入错误的数据,会导致死机。如需要输入整数时却输入英文字母,就可能会死机。比较好的处理办法是,程序先暂时把数据当作字符串读入,检查字符串中是否含有不合理的字符,如果字符串中都是0~9的数字字符,就把字符串转成整数,不然就请用户在输入一次。 内部文件还可应用在动态改变输出格式,输出格式可以事先存放在字符串中,程序进行时,动态改变字符串内容就可以改变输出格式。(见书P263) NAMELIST: NAMELIST是很特殊的输入/输出方法,收录在f90标准当中,f90中有统一NAMELIST的格式。 NAMELIST可以把一组相关变量封装在一起,输入/出这一组变量时,只要在write/read中的NML字段赋值使用哪一个NAMELIST就行了。 example: program ex0918 implicit none integer :: a = 1, b = 2, c= 3 namelist /na/ a,b,c write(*,nml=na) stop end program ex0918 NA A = 1, B = 2, C = 3, / 程序中把a,b,c这三个变量放在名字叫做na的namelist中。namelist也算是声明的一部分,必须编写在程序执行命令前面。 NAMELIST的语法 很类似COMMON,不过使用namelist时一定要取名字: namelist /nl_name/ var1, var2, ... !后面的变量会放在nl_name这个namelist中。 封装好namelist后,在write的NML字段中指名要输出哪一个namelist,就可以把namelist中的变量全部输出。 write(*,nml=na) !输出na这个namelist 输出namelist时候不能赋值输出格式,f90标准中规定输出namelist时首先会输出符号,后面紧接着这个namelist的名字。接着会根据顺序输出变量的名称,等号以及内容,变量之间用空格或逗号来做分隔,最后使用除号来作结束。 至于每个数值内容会使用何种格式输出由编译器自行决定。 NAMELIST也可以用来输入数据,不过通常都会用来读取文件, 不会用在键盘输入。输入格式需要按照前面的格式。na ....../ 不需要按照变量顺序输入,程序会自动按照变量名称来设置数值。变量甚至可以重复输入,不过变量会得到最后一次设置的数值。 namelist通常使用在文本文件的输入/输出中,使用read从文件中读取数据时,会自动从目前的位置向下寻找存放namelist的地方。 example: program ex0920 implicit none integer :: a(3) namelist /na/ a open(10, file="ex0920.txt") read(10, nml=na) write(*, "(3I2)") a stop end program 输入文件的内容如下: happy birthday na a = 1,2,3/ 程序打开时,读写位置在文件的开头,read命令会自动向下寻找na这个namelist的存放位置来读取数据,这边可以看到namelist处理数组的方法,它会在等号后面根据顺序显示数组内容。
个人分类: Fortran|16239 次阅读|0 个评论
通过孪生图灵机获得广义双语的协同操作
geneculture 2012-9-22 20:27
通过孪生图灵机获得广义双语的协同操作
本文 旨在 介绍一种通过孪生图灵机获得的三类双语之间协同操作的间接形式化双语信息处理系统。它不仅可以通过数学,而且可以通过汉语,以间接计算的方式 完成 图灵测试。其 步骤 为:a.采用二进制数计算,用两台图灵机相互测试,从而完成图灵测试;b.采用十进制数间接计算,以空格序号测试另一台图灵机,从而完成图灵测试;c.采用十进制数间接计算,以汉语单音节的“字”的相关序号测试另一台图灵机,从而完成图灵测试——此时其等价形式是代码化的塞尔中文屋。由此可见的 意义 是:虽然数学运算仅发生于机际,汉英或英汉双语对话仅发生于人际,但是,凭借计算机的辅助可以达成交流。不仅如此,术语和俗语的知识本体也可以通过其在具体表格中的唯一的十进制代码实现测序定位。因此可以说,人际或机人之间完全可以按照函数关系实现双语转换。
个人分类: 双语信息处理|3123 次阅读|0 个评论
[转载]【C/C++】fwrite和fread函数的用法小结
zhenghui2915 2012-9-19 23:28
fwrite和fread函数的用法小结 转载地址: http://purpleroom.blog.sohu.com/133812394.html fwrite和fread是以 记录 为单位的I/O函数,fread和fwrite函数一般用于二进制文件的输入输出。 #include stdio.h size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); 返回值:读或写的记录数,成功时返回的记录数等于nmemb,出错或读到文件末尾时返回的记录数小于nmemb,也可能返回0。 fread和fwrite用于读写记录,这里的记录是 指一串固定长度的字节 ,比如一个int、一个结构体或者一个定长数组。 参数size指出一条记录的长度,而nmemb指出要读或写多少条记录,这些记录在ptr所指的内存空间中连续存放,共占size * nmemb个字节, fread从文件stream中读出size * nmemb个字节保存到ptr中,而fwrite把ptr中的size * nmemb个字节写到文件stream中。 nmemb 是请求读或写的记录数,fread和fwrite返回的记录数有可能小于nmemb指定的记录数。 例如当前读写位置距文件末尾只有一条记录的长度,调用fread时指定nmemb为2,则返回值为1。 如果当前读写位置已经在文件末尾了,或者读文件时出错了,则fread返回0。如果写文件时出错了,则fwrite的返回值小于nmemb指定的值。 下面的例子由两个程序组成,一个程序把结构体保存到文件中,另一个程序和从文件中读出结构体。 fread和fwrite的例子程序如下: /* -------------------writerec.c--------------- */ #include stdio.h #include stdlib.h struct record { char name ; int age; }; int main(void) { struct record array = {{"Ken", 24}, {"Knuth", 28}}; FILE *fp = fopen("recfile", "w"); if (fp == NULL) { perror("Open file recfile"); exit(1); } fwrite(array, sizeof(struct record), 2, fp); fclose(fp); return 0; }/* -------------------readrec.c----------------- */ #include stdio.h #include stdlib.h struct record { char name ; int age; }; int main(void) { struct record array ; FILE *fp = fopen("recfile", "r"); if (fp == NULL) { perror("Open file recfile"); exit(1); } fread(array, sizeof(struct record), 2, fp); printf("Name1: %s\tAge1: %d\n", array .name, array .age); printf("Name2: %s\tAge2: %d\n", array .name, array .age); fclose(fp); return 0; } $ gcc writerec.c -o writerec $ gcc readrec.c -o readrec 发现生成的文件recfile不能直接打开。 原因:我们把一个struct record结构体看作一条记录,由于结构体中有填充字节,每条记录占16字节, 把两条记录写到文件中共占32字节。 该程序生成的 recfile 文件是二进制文件而非文本文件 ,因为其 中不仅保存着字符型数据,还保存着整型数据24和28(在od命令的输出中以八进制显示为030和034)。 注意,直接在文件中读写结构体的程序是不可移植的,如果在一种平台上编译运行writebin.c程序, 把生成的recfile文件拷到另一种平台并在该平台上编译运行readbin.c程序,则不能保证正确读出 文件的内容,因为不同平台的大小端可能不同(因而对整型数据的存储方式不同),结构体的填充方式 也可能不同(因而同一个结构体所占的字节数可能不同,age成员在name成员之后的什么位置也可能不同)。 通过readrec程序读取文件recfile的内容,说明writerec程序的确记录成功写入recfile中。 从recfile读出的内容如下: Name1: Ken Age1: 24 Name2: Knuth Age2: 28 fwrite和fread的应用举例: 1.将一个字符串写入文件: char *str="hello,I am a test program!"; fwrite(str,sizeof(char),strlen(str),fp) 2.将一个字符数组写入文件: char str ={12,33,23,24,12}; 先计算数组元素个数nmemb,之后 fwrite(a,sizeof(int),nmemb,fp) 注:由于程序生成的文件是二进制文件而非文本文件,因此,不用机器,整数的表达不同, 所以无法直接打开生成文件。可通过fread函数检验数据是否写入文件。
个人分类: VC++|2 次阅读|0 个评论
[转载]ARCGIS data format_e00 coverage & shapefile
tangpq 2012-9-14 15:40
e00:后缀为E00的文件是ESRI的一种通用交换格式文件。这种文件通过明码的方式表达了Arc/Info中几乎所有的矢量格式以及属性信息,广泛应用于与其他软件之间进行数据交换。但是ESRI没有提供有关的格式说明。可以用于通过E00格式文件建立与ESRI系列软件之间的数据交换。 coverage:一种拓扑数据结构,一般的GIS原理书中都有它的原理论述。数据结构复杂,属性缺省存储在Info表中。目前ArcGIS中仍然有一些分析操作只能基于这种数据格式进行操作。Coverage 是ArcInfo workstation 的原生数据格式。之所以称之为“基于文件夹的存储”,是因为在windows资源管理器下,它的空间信息和属性信息是分别存放在两个文件夹里。例如,在我的电脑E:\MyTest\example 文件夹中,有 3 个coverage,它们在 windows 资源管理器下的状态所有信息都以文件夹的形式来存储。空间信息以二进制文件的形式存储在独立的文件夹中,文件夹名称即为该 coverage 名称,属性信息和拓扑数据则以 INFO表的形式存储。Coverage将空间信息与属性信息结合起来,并存储要素间的拓扑关系。 然而,通过 ArcCatalog,我们能将存储空间信息的文件夹中的 coverage二进制文件与存储属性信息的 INFO 文件夹中的 INFO表联合表达为 coverage,当使用 ArcCatalog 对 coverage 进行创建、移动、删除或重命名等操作时,ArcCatalog 将自动维护他们的完整性,将 coverage和 INFO文件夹中的内容同步改变。所以对 coverage进行操作,一定要在 ArcCatalog 中进行。 coverage 是一个非常成功的早期地理数据模型,二十多年来深受用户欢迎,很多早期的数据都是 coverage 格式的。ESRI 不公开 coverage 的数据格式,但是提供了 coverage 格式转换的一个交换文件(interchange file,即 E00),并公开数据格式,这样就方便了 coverage 数据与其他格式的数据之间的转换。 Coverage 是一个集合,它可以包含一个或多个要素类。 shp:一个ESRI的shape文件包括一个主文件,一个索引文件,和一个dBASE表。主文件是一个直接存取,变量记录长度文件,其中每个记录描述一个有它自己的vertices列表的shape。在索引文件中,每个记录包含对应主文件记录离主文件头开始的偏移,dBASE表包含一feature一个记录的feature的特征。几何和属性间的一一对应关系是基于记录数目的。在dBASE文件中的属性记录必须和主文件中的记录是相同顺序的。命名习惯所有文件名都符合8.3命名习惯。主文件,索引文件和dBASE文件有相同的前缀。前缀必须是由字符或数字(a-Z,0-9)开始,后跟0到7个字符(a-Z,0-9,_,)主文件的后缀是.shp,索引文件的后缀是.shx,dBASE表的后缀是.dbf。文件名中的所有字母在对文件名敏感的操作系统中都是小写的。 geodatabase:Geodatabase是一个存储数据集的容器,同时将空间数据和属性绑定起来。拓扑数据也能够存储在Geodatabase中并对特性进行建模,比如说在表示道路交叉时可以对道路之间的相关性进行设定。在使用Geodatabase时, 很重要的一点就是要理解要素类(Feature Classes)就是就是一系列要素,它以点、线或多边形的形式呈现。 在使用Shapefile格式时每个文件只能存储一类要素然而Geodatabase却能够在一个文件中存储多个要素或者是多种类型的要素。
1650 次阅读|0 个评论
[转载]美制造出首个纳米线光子开关
crossludo 2012-9-13 11:10
美制造出首个纳米线光子开关 为依靠光脉冲计算的光子计算机的诞生打下了基础 计算机速度可能每年都在提高,但如果用 光脉冲 而不是电流来代表它的二进制代码1和0,将给计算速度带来质的飞跃。据每日科学网9月10日报道,美国宾夕法尼亚大学研究人员用 硫化镉纳米线 制造出了第一个全光光子开关,并将其与逻辑门结合,而这是计算机芯片处理信息的基本组成部分。研究人员指出,这是光子学前沿领域的重要进展,未来有望带来用光计算的光子计算机。相关论文发表在《自然·纳米技术》杂志上。 研究由该校工程与应用科学学院材料科学系副教授莱特斯·阿加瓦尔和研究生布赖恩·皮科尼共同指导。这一革新型开关以他们早期的研究为基础。他们的早期研究显示,硫化镉纳米线具有极强的 光—物质耦合性 ,用其操纵光线非常有效,而这种特性对开发纳米光子电路至关重要。现有的光控制装置非常笨重,而且所需能量比电子设备更多。 “对纳米光子结构而言,最大的难题是让光线进入,再加以处理,然后让它们出去。”阿加瓦尔说,“我们的主要创新就是解决了第一个问题,使 纳米线本身成为一种芯片上的光源 。” 他们先在纳米线上刻下精确的缝隙,然后在第一段纳米线输入足够能量,这样其底端和缝隙就会发出激光。由于开始时他们只用一根纳米线,所以两段的端口完全匹配,第二段能有效吸收并传输来自第一段的光。阿加瓦尔说:“当第二段接到激光,我们就发出另外的光,并关闭纳米线中正传来的光。这样它就成了一个开关。” 研究人员能检测从第二段纳米线端口发出的光的强度,以确保开关能有效表现逻辑装置中所用的二进制状态。他们把两根纳米线结合构成 “Y” 型,成功构建了一个与非门(表示在所有输入为“1”时返回输出为“0”)。这一与非门“功能完整”,如果以正确的顺序输入,它们能做任何类型的逻辑运算,因而构成了通用计算机处理器的基础。 “在未来,我们可能会看到‘消费电子产品’变成了‘消费光子产品’。”阿加瓦尔说,“这项研究表明这是可能的。” 【相关阅读】: 利用光子形状加密信息
个人分类: 物联工程|1725 次阅读|0 个评论
广义和狭义的双语
geneculture 2012-9-12 15:38
狭义的双语 ,就是人际之间的,如:汉语和英语 广义的双语 ,还增加了人机或机人之间的,如:语文(自然语言)和算术(机器语言);以及机际之间的两类算术语言,如:二进制数和十进制数 附录1 : 煌罗德修15:08:27 第三脑和虚拟天平是什么关系? ZouXiaohui15:13:22 这是两个比喻: 用相对于第一脑(人)和第二脑(机)而言的 第三脑 指代 协同智能计算系统 。 用相对于实物天平而言的 虚拟天平 指代 间接计算工具 ,可体现 第三脑 的功用。 附录2 : 煌罗德修 15:17:43 三类语言 是专用术语吗? ZouXiaohui 15:21:42 三类双语,指:两类算数语言(即二进制数和十进制数)、算数语言和自然语言、两类自然语言(即汉语和英语) ZouXiaohui 15:23:03 即: 机际双语——两类算数语言(即二进制数和十进制数)、 机人双语——算数语言和自然语言、 人际双语——两类自然语言(即汉语和英语) ZouXiaohui 15:24:14 还有一类双语是嵌套在里面的,即:术语和俗语 煌罗德修 15:24:45 这是广义双语的概念吧? ZouXiaohui 15:24:50 还有什么问题?请一并提出来! ZouXiaohui 15:24:55 是的 ZouXiaohui 15:25:24 狭义的双语,就是人际之间的,如:汉语和英语
个人分类: 双语信息处理|1497 次阅读|0 个评论
神经科学杂谈6:电脑和人脑的最大不同--计算和记忆
热度 2 jingpeng 2012-9-3 10:05
神经科学杂谈6:电脑和人脑的最大不同--计算和记忆
电脑和人脑的原理 我们使用的电脑是一个图灵机,简略地说,本质上是一个有限状态自动机(finite-state automaton)加上一条纸带(tape)。这个状态机可以实现一些固定规则的字符转换,如果按照二进制的计算规则设计这个状态机,就可以实现自动的加法计算过程。但是光有计算,只能相当于简单的计算器,缺点是缺乏记忆,只能识别regular set,应用在regular language上。加上这个tape,就是弥补记忆的不足,可以识别phase grammar定义的语言,功能上得到扩展,能够实现乘除运算了。这个tape是一个无限长的纸带,上面写满了01,计算机可以在纸带的任意位置读写。早期的电脑就是老老实实地读写纸带的,现在改进成了磁盘,U盘等等,但本质上是一样的。这种设计结构,是针对计算设计的,只要电流流过,就通过有限状态机的转换,实现了计算,所以电脑叫计算机是名符其实,这个学名还更准确些。电脑的记忆也是显式的,纸带上存放的是什么,可以直接读取,你也可以删除特定的文件。显式的存储有一个缺陷,就是鲁棒性不足,磁盘坏道了一点,那这点信息就丢失了。当然,为了弥补这个缺点,实际上我们的电脑在存储和传输信息的时候,通过冗余和校验,来提高鲁棒性。图灵机还有一个致命的缺点:太机械化。这是各个组成部分都定义明确带来的,图灵机有完整而明确的理论,概念区分非常清晰,什么样的有限状态自动机可以处理什么类型的语言,都可以很明确地证明。这是一个优点,却也形成电脑的一个致命的缺点,缺乏模糊性和通用性,设计的特定程序,只能处理特定的问题。要处理更复杂的内容,提高适用性,就必须提高算法或者程序的复杂度。这种策略面对简单的模型世界,还是成功的。但应用到真实世界的问题,就出现很多理论上可计算,实际上算不出来的情况,典型的就是旅行商等NP hard问题。这个问题大大限制了程序和算法的通用性,根源就在于现在的电脑是图灵机。 而人脑则很不同,计算和记忆都是隐式的,而且计算似乎是通过记忆间接实现的。人脑组成的关键是神经元网络,输入的神经电冲动经过这个网络,输出特定模式的神经冲动信号。所有的记忆都分散存储在各个神经元内部。你记起一个人,动用了大量神经元的记忆,所以这个人的形象和事迹是分散存储在多个神经元上的。这种记忆存储是隐式的,你不能找到某个神经元是存储这个人的(也有研究找到了这种神经元的,但现在还有争议)。这种系统和机制的好处就是鲁棒性非常强,你杀死个把神经元,对你这个人几乎没有影响,不会影响系统整体的输出模式。还有一个好处,就是想法难以检测,如果拿你做个磁共振成像,就知道你喜欢谁,那这个世界就没那么多感情纠纷,或者说没那么有意思,立马变枯燥了。另外,人脑也有弊端,就是不适合计算,所以敌不过现在的电脑。你要做个简单的计算,先要背乘法口诀,实际上是通过记忆实现计算的。另外,人脑网络实际上是一个输入模式,对应特定的输出模式,由于网络的复杂性,这种模式的匹配可以有广泛的适应性,使得人能够应对复杂的真实世界。 人工智能的出路 图灵机在理论上是很强大的,几乎可以实现任意类型的计算,这也是被人感兴趣的主要原因。基于图灵机,早期的人工智能野心勃勃地开发通用问题求解器(General Problem Solver),虽然在一小块数学领域内成功了,推广到复杂的真实世界,却遭遇了巨大的困难,一直没有很大进展。根据人脑和电脑原理的区别,我这个外行,斗胆提提想法,人工智能可能有两条出路: 人工神经网络 。人工神经网络的发展历史很早,也出现了一些简单的应用,但在接近人脑的功能上,也是几十年没大进展了。相对于人脑的几十亿个神经元,现在的人工神经网络是很小的,简直弱爆了!虽然理论上可以证明,三层神经元网络可以实现任意的计算,但要接近人脑,我觉得,三层是远远不够的,需要更多。而且结构上,人脑也是高度复杂的,不是按照简单的层来区分的。人工神经网络的结构可能也要接近人脑才行,最好是直接在人脑神经网络结构上,进行模拟。但我们现在连鼠脑的神经连接结构都不清楚,更不用说人脑了。现在越来越热的连接组计划,就是要搞清楚这个问题。最近有一个野心勃勃的计划,通过超级计算机来模拟人脑,他们基于的连接模式是很简单的功能柱,全部是仿真出来的,并不是基于真实神经元连接结构。即使是这样,他们也有实力竞争欧洲一个十亿欧元的大项目,可见这个问题是多么重要。但是,即便是现在最NB的超级计算机,计算和并行的能力也比小小的人脑小多了。所以,这个项目投资巨大,但我大胆预测,在十年内效果可能并不显著,不会像鼓吹的那样,产生原创的思考,甚至作诗写小说!主要依据是:(1)缺乏真实人脑的神经元连接结构;(2)计算机的并行能力不足,而且消耗大量计算资源;(3)需要经验的积累,来训练这个网络;(4)”知识“的表示和编码问题没有解决。这种基于图灵机的模拟仿真,即使有接近无限快的计算能力,无限快的网络传输,无限大的存储,无限复杂的程序和算法,得到的智能可能也是一种假象,只是像人的表现罢了,没有真正的自由意志。即便通过了图灵测试,也只能实现弱人工智能,在博文《 西尔勒的中文屋子 》中有详细的解释。 仿生学 。图灵机虽然可以做任意类型的计算,但还是离真实世界有一步不可跨越的界限--可计算性。真实世界的物理过程是不能完全用计算仿真的,某些过程具有不可计算性!比如三体运动。仿生学是我认为最有前景的人工智能方向,因为是通过物理作用来模拟,而不是通过计算来模拟,可以克服不可计算的问题,有希望产生强人工智能的“脑”。通过技术的改进,还有希望能力比人脑强,那就真的到”奇点“了,科技进步的速度到达转折点。我在博文《 Creating the Impossible ! -- 创造意识 》中有详细的分析,这里就不展开了。这里牵扯很多伦理问题,不是这里讨论的内容。 人脑和电脑 参考资料: 【1】 H.Rosen, Kenneth. 离散数学及其应用 . Translated by 袁崇义. 机械工业出版社, 2007. 【2】 何小阳的科学网博客,计算机不能做什么?系列博文 【3】 罗杰·彭罗斯. 皇帝新脑 . Translated by 许明贤 and 吴忠超. 湖南科学技术出版社, 2007. 【4】 拉塞尔, and 诺文. 人工智能——一种现代方法 . 北京: 人民邮电出版社, 2004. 【5】 雷·库兹韦尔. 奇点临近 . Translated by 李庆诚, 董振华, and 田源. 机械工业出版社, 2011. 【6】 DeFelipe, J. “From the Connectome to the Synaptome: An Epic Love Story.” Science 330, no. 6008 (2010): 1198. 【7】 Miller, Greg. “Blue Brain Founder Responds to Critics, Clarifies His Goals.” Science 334, no. 6057 (November 11, 2011): 748 –749.
个人分类: 科学-脑|11439 次阅读|7 个评论
探秘公钥与私钥
yufree 2012-6-16 14:09
探秘公钥与私钥
最近读了阮一峰关于数字签名的 介绍 ,中间有一个问题一直困扰我:既然公钥与私钥是不同的,那它们又是如何保证可逆的解读明文与密文呢?直接讨论这个问题理解上有点困难,先从简单的加密与解密开始吧。 1什么是密码 这个问题似乎很简单,密码学里密码(cipher)就是用来加密与解密的运算法则。一般使用时,密码(cipher)跟暗语(code)是差不多的,但在古典密码的范畴里,code更多指利用codebook解读的无规律语句,而cipher则强调存在相应的运算法则。 2密码的分类 如下图,密码被分为古典密码与现代密码,至于中间的那个Rotor machine是用来解决流密码的一种机械解码装置,算是古典密码的一种,因为区别古典密码与现代密码的最主要方式就是看密码的表示方式是否是二进制的。古典密码主要采用移位与替换来实现加密与解密,众所周知的凯撒密码就是一种移位密码;现代密码主要包括私钥加密技术与公钥加密技术,其中私钥加密技术本质上与古典密码差不多,加密解密的key是一致的,但公钥加密技术就不一样了,其加密与解密的key是不一样的。这就是今天所要讨论的问题,这样的加密机制是什么。 3密码的有效性 在讨论公钥加密机制之前,有必要先讨论下密码的有效性问题。众所周知,密码是用来保密的,如果很容易被第三方解密那就没什么意义了,那么密码是如何保证自己不被破解呢?首先,密码可以借用随机数来实现,但这里提到的随机数必须是真随机数而不是由函数提供的伪随机数,例如 费纳姆密码 就是采用明文加随机数来实现,shannon就证明过理论不可解的密码的key必须至少与明文一样长而且要加入随机数,但因为随机数实际上往往并不随机,所以事实上存在被破解的可能;其次,密码可以通过庞大的运算量来实现,换句话说就是解密的成本(如时间或运算量)过大,而明文时效性有限,这样基于实际上解密的不经济性而提供的密码正是当今使用的主流;最后,上面两种问题如果不考虑技术限制都可能被破解,这其中一个重要的原因就是明文代入的规律性,也就是说,密文带有明文的统计信息或自然语义信息越多就越有可能被破解,但另一方面,如果密文没什么规律而明文又是有规律的那这种加密方式本身事实上就是包含了明文,这样的加密方式并不具备通用性因而意义也不大,爱伦坡的小说中就出现过一个密文全是i的信,这样的密码解起来自然就不太可能了。为了实现密码的有效性与通用性,私钥加密技术就出现了,例如DES算法、AES算法……这类算法虽然不错但推广时会发现如果两个人用所需要的key还少一些,但在互联网上,数以亿计的用户如果在实现通信时互换key,且不说这个过程有多麻烦,单是key的数量就是天文数字,因此公钥加密技术出现了。 4公钥密码加密的理论基础 关于公钥密码的表现形式,请参照阮一峰的博文。这里要谈的是为什么加密与解密不用同一把钥匙。 直觉上,加密与解密是互逆过程,也就是说算法也应该互逆。现代密码中采用2进制通讯,所以这类算法至少对二进制互逆,最常用的莫过于XOR算法。这类算法的实现就是对比明文与key的二进制代码,数值一致则密文为0,否则为1;这样解密时就简单多了,同样的key去对比,明文是1,key是0则密文为1,解密出的明文也还原为1。当然这说的是不包含其他算法的加密解密,但过程上只要可逆,我们直觉上就更易接受。 在公钥加密中,主要采用了单向函数。通俗地说,单向函数的意义就在于逆向运算困难,这里主要采用的是素因数分解与离散对数两种运算。 1)素因数分解。这个不难理解,给你一个数,例如42,你可以规定是通过2×3×7得到的,但它也可能是6×7得到的,对于小数字似乎不明显,但对于一个大数而言例如1675401,你能看出来是3×7×19×19×13×17得到的吗?如果里面的素数因子越大,这样的反算就越困难。但相反的,如果你知道数m的n-1个因子就很容易得到另一个未知的因子,这就是key,也就是攻克单向函数的单向陷门函数。 2)离散对数。如果你知道a^b=c这个公式中的a与b,那么c很容易就求出来了,但如果知道的是a与c求b就悲剧了,这就是离散对数问题。 那么这些运算方法如何运用在公钥加密里的呢?以RSA算法为例讲解的话,就要了解下取模运算,取模运算可以保证数n的运算结果只出现在1~n-1之间,且也能保证四则运算都可以进行,这对于擅长处理有限域问题的计算机而言是十分有利的。那么取模运算又是如何与上面的素因数分解结合在一起的呢?这就依赖 费马小定理 了,如果两个数a与n互素的话,那么a^(n-1)!=1(mod n)。但事实上,费马小定理判定出的数不见得就是素数,如3215031751这个数在a=2,a=3,a=5,a=7上是满足费马小定理的,但这是个伪素数(151×751×28351)。但在实际应用上是可以接受这种误差的,所以这个问题到不用太纠结。事实上,费马小定理只是欧拉定理的一个特例,事实上,a的欧拉函数(只小于n与n互素的数的数量)次方对n取模都得1,所以我们可以看到事实上在1~(n-1)的所有所有整数上,有 a^(kL+1)=a(mod n) 其中,L是n=pq中(p-1)与(q-1)的最小公倍数,k为非负整数 那么对于RSA算法而言是如何利用这些规律的呢? 首先,加密的表示是C=P^e(mod N),这里P是明文,C是密文,e N都是公钥;解密的表示是P=C^d(mod N),其中d是私钥。将解密的公式代入会发现事实上有C=C^ed(mod N) ,那么这里面的问题就很明显了,只要ed=kL+1的话这一组加密与解密就成立,更重要的是,L正是素因数的最小公倍数,这就将素因数分解与加密相结合了,同时也可以发现用不同的e(公钥)可以得到不同的d,一般为了安全性e会选的大一点这样对应的d也会大一些,破解起来就更麻烦。在RSA算法中,明文通过编码方式转换为二进制码,二进制码通过分组转换为10进制的数,然后通过公钥进行加密,解密的时候根据私钥计算得到明文,然后转成二进制码,之后转为明文就可以了。从这一过程可以看出事实上加密与解密的关键在于公钥与密钥一定是配对的而不是独立的。上面是用素因数分解构成的算法,实际离散对数也可以构成相应的算法,只不过还需要一个随机数来辅助。说到这里,你会发现在这个加密体系中运算量实际是很大的,与之形成对比的是私钥加密体系,其运算速度快,但问题就是发放钥匙比较麻烦,所以实际使用时往往采用hybird加密方法,也就是用公钥体系加密私钥体系的钥匙,用私钥加密大量的明文信息且一同封包传输。至于说不加密的明文传输中想知道文本信息是否被篡改,可以通过校检hash函数值来实现(毕竟不是每条信息都需要加密)。如果还不放心,可以用依赖私有钥匙的hash函数来校检。再不放心就要用电子签名了,这一点在阮一峰的博文里提到了就不赘述了。 5公钥的应用实现 前面扯了一些基础,可能你会奇怪,这么复杂的过程怎么感觉不到呢?其实很容易感觉到,我们需要的是有公信力的第三方颁布的公钥证书而已。当我们浏览加密网页时,服务器传输的事实是用自己私钥加密过的密文与证书,而我们的浏览器需要做的就是通过证书管理器来校检这证书是否靠谱,不靠谱就会提示错误而靠谱就会用证书里的公钥与服务器通讯。KK在《失控》里提到加密必胜,并认为这是节制互联网无限链接的法宝,没错,无规矩的自由是混乱,有隐私的互联才会稳定。
个人分类: 科搜研手册|5426 次阅读|0 个评论
从二进制到二进制的思维方式
热度 4 liuchao666 2012-4-23 08:54
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4 /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.5pt; mso-bidi-font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:宋体; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt;} 从二进制到二进制的思维方式 ——从计算机的思维到人类的思考之一 同语言,同文字相同,数字,也是人类常用的描述客观世界的一种符号体系,差别在于,语言文字易于理解,数字则枯燥难以记忆。从哲学上说,“世上不存在两片相同的树叶”,类似地,我们还有:“世上不存在两个体重相同的人”,“世上不存在两个身高相同的人”,“世上不存在两个 DNA 相同的人”……因此,无论是身高,还是体重,和姓名一样,都可以唯一的标识一个客观的个体。 二进制,作为一种计数方式,同三进制,十进制,二十进制……相似,只是一种数学描述手段,其主要优点在于符号简单。但是,由于二进制在计算机中的广泛使用,由于计算机在今天的飞速发展,这就使之形成了一种独特的文化体系——二进制的思维方式。 本质上说,从二进制的计数方式到二进制的思维方式,两者没有本质的联系,但社会有时很无奈,人类的某些固有属性在此起到了决定性的作用——二进制的思维,是人类在二进制计数方式上的一次简单而粗暴的扩张。 在二进制计数体系中,只有两个符号: 0 , 1 ;在人类的社会生活中,对于语句有两种判断方式:真,假。如果用 0 表示假,用 1 表示真,然后定义一下“与”,“或”的运算关系,突然使得人们发现了一个新天地——用数学描述逻辑,或者说,用数字来严格的描述语言文字。这种扩充在理论研究中获得了一种实质的应用——命题逻辑。可以说,这也是一次成功的扩展。 遗憾的是,人类的语言不仅仅是由于命题组成,更多的时候,语言最多涉及的仍然是关于名词自身的判断——存在性。有没有上帝,有没有金山,有没有鬼神……什么是公平,什么是正义,什么是动物的本质属性……所有的概念词似乎才是语言世界的主宰,而“有”,“无”则是更加基本的属性。由于有了命题逻辑上的成功应用,人们再次对二进制进行了扩张, 0 :没有, 1 :有——这次的扩充并没有取得预想的成功。 “张三吃饭了”或者“张三没有吃饭”两者必有一个成立。 “马是白色的”或者“马不是白色的”两者事实上都不成立。 有、无的判断似乎与概念本身似乎具有一种相关性,不错,这就是专名与通名的差别。 二值判断逻辑只能处理专名——计算机不能处理通名?? 换个方法就可以补救一下。 既然没有办法用计算机表示“所有的马都是白色的”,那就是用“任意一个动物,如果他是马,那么他是白色的”的来表示。这样一来,通名就转换为了专名。 至此,我们不需要“马不是白色的”的表达方式了,而是“存在一个动物,他是马,但不是白色的”。 问题似乎得到了解决,但是,这里把一个简单的仅与“有限”相关的问题转换为了和“无穷”相关的问题。 用“ ∀ x(A(x)→B(x)) ,其中, A(x) 表示 x 是 A , B(x) 表示 x 是 B ,”表示“所有的 A 都是 B ”,这就是一切麻烦问题的根源——从二进制计数转换到二进制的思维,然后再在此基础上做简单的修补工作,这就是现有计算机思维不及人类的主要原因之一。 再后面的系列中,我们将进一步探讨究竟如何实现人类思考的模拟。
7475 次阅读|8 个评论
[转载]气象数据格式
yanghang 2012-4-17 11:30
NC格式介绍: http://blog.csdn.net/laomai/archive/2007/08/13/1740747.aspx GRIB GRIB 分为 GRIB1 , GRIB2 格式文件 GRIB码是世界气象组织(WMO)建议并通过的一种二进制比特流代码,它适用于表示数值天气分析和预报的格点场产品。GRIB码具有与计算机无关的特点,采用压缩数据表示形式,,压缩率一般在50%以上,因而利用GRIB码能加快数据传输速度,减少存储空间。 因为GRIB码是压缩的二进制代码 NCEP 美国国家环境预报中心(NCEP)和国家大气中心(NCAR)的全球再分析资料,在很多气候模拟和预测研究中都被作为区域气候模式的驱动场和初始场资料,并用来检验模拟结果的。作者通过对NCEP的2种再分析资料NCEPⅠ和NCEPII与中国台站观测资料的月平均温度和月降水总量进行相互插值,分析和比较了NCEPⅠ、NCEPⅡ再分析值与中国区域内观测值之间的差异以及2种再分析资料之间的差异。从结果可以看到,NCEP再分析资料的月平均温度较观测值普遍偏低,而月降水总量较观测值则偏高;就季节变化而言,NCEP再分析值在夏季和年平均模拟的较好,冬季较差。同时可以看到,在温度和降水方面NCEPⅡ较NCEPⅠ都有所改进,尤其在中国东部地区,改进较为明显。 继美国环境预报中心(NCEP)和国家大气研究中心(NCAR)联合推出月平均再分析资料(1949-01)和日平均再分析资料(1958-01-01)后,最近又正式对外发布逐6h再分析资料集(1958-01-01T00),这为研究天气尺度和中尺度系统变化过程提供了良好的条件,并能为中尺度数值模式及区域气候模式提供初始场和侧边界条件。 该资料以netCDF(netware Common Data Form)的形式存储,通常可用COLA发展的自由软件GrADS或PMEL发展的可视化自由软件FERRET和RSI提供的商用软件包IDL进行操作处理,逐6h再分析资料集包括7个基本气象要素,根据变量名逐年生成独立文件。气温、位势高度、纬向风和经向风文件容量均为521Mb/a(17层);相对湿度和比湿文件容量均为245Mb/a(8层);垂自速度文件容量为367Mb/a(12层)。因此全部42年7要素逐6h再分析资料需要124Gb的介质存储,资料量极其庞大。中心近期已获得1969、1980、1991和1998年完整的资料集(注:这些年份是在近30年来长江流域4个降水正异常年份),它们分别存放在4个8mm磁带上和24个光盘上, T639数据格式及其读取方法 完善的数值预报技术是发展现代天气预报业务的基础。T639为日常业务提供了更加精细化、时效长的预报资料。为天气预报服务提供了强 有力的保障。以T639为基础制作自动化的预报工具,必须读取T639的数据资料。简要介绍了T639的基本含义和主要内容.剖析了T639的数 据格式,提供了T639数据的读取方法。 双线性内插
5919 次阅读|0 个评论
计算实验技术
热度 1 luoxc 2012-4-10 18:54
前言 “计算实验技术介绍” 是我在 1999 年首届深圳国际高新技术交易会散发的资料,约 50 份。除了参会大公司老总,有四位美国硅谷博士,以及美国运通银行亚州区总裁(据说是哈佛物流博士)都有得到。现再次公布,以便网友更全面理解博文“我的全新数学观”的形成过程。特别是该文表明,我在 1999 年就认为吴文俊院士获国家最高奖是完全不意外的。 计算实验技术介绍 一、 产生背景 在全新数学观下,计算实验技术的产生是一个漫长的朦胧的过程,甚至可以追溯到罗祥存先生幼时的一些性格和思维特征。为简洁计,仅将其要点表述如下: 1 、对几乎所有领域计算机模拟技术,以及相应模型的深入分析研究,是计算实验技术产生的直接原因。 2 、计算实现技术对数学的影响研究是构造计算实验技术的主要动力。 3 、史丰收速算法对数学两项重要的启迪:一是现行计算实现技术有非常大的改造空间;二是中国古代朴素的直观的构造性算法具有十分重要的作用。 4 、中西科技精华有机交融,构造了计算实验的关键技术。 5 、科学史和数学史的交叉思辩研究和实例考证,特别是对数学直观主义学派观点的研究考证,形成了全新数学观下的计算实验技术。 二、基本概念 1 、全新数学观简介 美国著名数学史学家 M ·克莱因( Morris kline ) , 在他《古今数学思想》 ( 上海科技出版社 81 年 ) 一书中 , 最后一段意味深长的引语 , 幸许有助于理解我的全新数学观。 Weyl 对数学的现状作了恰当的描述:“关于数学基础和最终意义的问题还是没有解决,我们不知道向哪里去找它的最后解答 , 或者根本就不能期望会有一个最后的客观回答。‘数学化 ’ (Mathematizing) 很可能是人们的一种创造性活动,象语言或音乐一样,具有原始的独创性 , 它的历史性决定不容许完全的客观的有理化( rutionalization )” 。 我的全新数学观就是对以 Weyl 为代表的许多数学思想家上述猜想的肯定性回答:数学作为工具应归属广义语言学,这是数学的本质属性;数学作为方法可归属广义科学技术学,这是数学的表面属性。几千年来,由于数学计算工具——表现数学应用效果方法的落后,一直把数学的表面属性作为本质属性,其实是很无奈的事。因为数学家找不到如同文学家的文字和语言、音乐家的谱和乐器、画家的笔和颜料,能把自已通过观察和体验到的东西,直观形象表现出来的工具,从而体现自己原始的独创性。 电子数字计算机的出现根本改变了这一现状。 2 、计算实验 计算实验是实践数学语言本性的工具,它的原始的独创性表现在对科学技术的不断创新上。 设计、研制、实施一个计算实验的过程和文学艺术创作的过程是一致的,而和目前数学研究和软件工程有本质的不同。 计算实验在表面形式上类似物理实验和化学实验,实验仪器是计算机软硬件,实验方法是猜想和一般实验技术的结合。计算实验相对于“虚拟现实”技术而言,可以叫它“虚拟猜想”技术。 三、关键技术 计算实验的关键技术可以用一句话来概括:建立近似的数学模型求精确解。这里包括两项技术: 1 、快速近似建模技术 只有凭借渊博的知识,掌握多种多样的建模方法和技巧,积累丰富的实际建模经验,并进行创造性的归纳,是计算实验最重要的基本功。 2 、快速求精确解技术 ( 略 ) 四、应用实例 封闭长方体车厢装 n 个相同尺寸长方体货箱有 6 的 n 次方种装法,哪种装法最优?这个问题是典型的 NP 难题 ( 俗称指数爆炸 ) ——一个令无数数学工作者和计算机工作者折腰的难题。 同清华大学卢开澄教授,国防科技大学有关专家讨论的结果是:当装箱个数大于 100 时,世界上最好的计算机也无法在允许的时间内算出结果 ! 不久前,在美国著名的“贝尔科尔公司” 大力支持下,五大洲的 600 多位“解密专家” 和 1600 台高性能的 Internet 计算机全部到位联网,经过整整八个月,终于解开了“世界密码之王”—— —个长达 129 位数的长码。如果只用一台计算机算,则至少要化 4 亿年!(见 1999 年 9 月 19 日深圳特区报 13 版)显然,这只是 2 的 N 次方( N=129 )指数爆炸问题。 如果再考虑车厢尺寸误差、货箱尺寸误差、叉车和工人的可操作性 , 则问题就更复杂得不可思议了。 但在全新数学观的指引下 , 采用计算实验技术,像一位作家 , 独自一人 , 深入装箱现场“体验生活”——观察分析影响装箱工艺所有随机的不确定的因素的特征,一周即完成“素材收集”—— 快速建模,用一台只能做加减乘除的计算器,一个月即拿出“写作大纲”—— 快速求解算法总体思路,用一台 586 计算机,一年即完成“初稿”——智神装箱核心软件的开发。 1999 年 5 月 7 日 ,应浙江大学工业自动化国家重点实验室邀请,介绍了计算实验技术,并演示了智神装箱软件。演示结果表明:计算数千个货箱的装箱方法,只要数秒钟!这是未来生物计算机,量子计算机也办不到的。 五、适用范围引出的哲理 在全新数学观下的计算实验技术主要适用于自然系统,后工业化系统(如物流系统)的多目标优化,这里包括科研的、设计的、控制的、管理的、经济的一体化系统相互矛盾的多目标优化。 传统的形式主义数学,在蒸汽机化和电气化这两次工业革命中得以发展和完善,其应用成果主要表现在人造系统上(如火车、汔车、飞机等)。 被人们视为西方形式主义数学和科技结晶的计算机,实际上,其关键的实现技术——二进制,是著名数学家莱布尼兹受东方算学——八卦的启迪,才想出来的。这个被中国人引以自豪的历史故事,虽然很快就被绝大多数人淡忘了,但其中却蕴含了非常深刻的哲理:表面形式上由西方形式主义数学,而实质却是由东方数学——卦算,才形成的计算机实现技术是对西方形式主义数学的一个否定。 我国著名数学家吴文俊院士,最早感知到这个哲理。他在给中国数学简史作序中写到: “以《九章算术》为代表的中国古代传统数学,与以欧几里得的《几何原本》为代表的西方数学,代表着两种不同的体系,其思想与方法各呈特色。前者着重应用与计算,其成果往往以算法形式表达。后者着重概念与推理,其成果一般以道理的形式表达。前者的思维方式是构造性与机械化的。而后者往往偏重于存在唯一以及概念之间相互关系等非构造性的纯逻辑思维。前者由于它机械化的思维方式与算法形式的具体成果,从思想上与方法上正好切合于计算机出现后的时代要求。…中国古算的传统特色与其思想体系,对于未来数学的发展应起巨大的指导和推动作用。” 我用全新数学观创立的计算实验技术,实践并发展了吴文俊院士的这个预言。 六、重要意义 计算实验融合了数学的计算功能和物理学的猜想功能,在计算机的帮助下,使西方形式主义数学摆脱了几千年的包袱,而成为一种直接创造科学思想和方法的工具。 掌握了“计算实验”方法,就不怕“知识爆炸”。实际上,所谓“知识爆炸”现象,是用工业经济社会知识结构和思维模式,观察知识型经济社会出现的现象所产生的错觉。在这些“爆炸的知识”中,如果用知识的时间价值衡量,其中有大量的“泡沫知识”。 方法是人类最有价值的知识,作为创造方法的“计算实验”,在知识型经济社会的发展中必将起着重要的作用。 罗祥存 1999 年 10 月于深圳
个人分类: 全新数学观|3884 次阅读|2 个评论
[转载]输出单元刚度矩阵的方法
ghostfql 2012-3-31 16:42
1.用 命令 :*ELEMENT MATRIX OUTPUT 只设定Required parameter:ELSET的话,由于 结果 文件 (*.fil)是二进制文件,用文本编辑器打开是一堆我们看不明白的乱码,所以有必要 设置 一下文件 格式 。 2.用命令:*FILE FORMAT设定文件格式 将文件格式设为ASCII,那么结果文件我们就能够看明白了。 3.命令:*ELEMENT MATRIX OUTPUT的其他 参数 设定: 首先FREQUENCY要设定,否则会生成每一步的结果文件,这个文件会很大,举例来说,1800个单元 输出 单元 刚度矩阵 的方法 1.用 命令 :*ELEMENT MATRIX OUTPUT 只设定Required parameter:ELSET的话,由于 结果 文件 (*.fil)是二进制文件,用文本编辑器打开是一堆我们看不明白的乱码,所以有必要 设置 一下文件 格式 。 2.用命令:*FILE FORMAT设定文件格式 将文件格式设为ASCII,那么结果文件我们就能够看明白了。 3.命令:*ELEMENT MATRIX OUTPUT的其他 参数 设定: 首先FREQUENCY要设定,否则会生成每一步的结果文件,这个文件会很大,举例来说,1800个单元,共50步,全部 输出 的 单元刚度矩阵 有600M,这是一个很大的 数据 ,所以要把不需要的删除。并且在打开这个600M大的文件时发现,UntraEdit比记事本和写字板的打开速度快得多!假如共50步,我只想要最后一步的 单元刚度矩阵 ,那么可以设定 FREQUENCY=50,设定FREQUENCY=0表示不 输出 ,默认为每一步都 输出 。 其次可以设定结果文件名,设定时要使用OUTPUT FILE=USER DEFINED这个选项,将FILE NAME的值设定为想要的文件名,注意不要扩展名。 例如: *Elset, Elset=All, Generate 1,1800,1 *File Format,Ascii *Element Matrix Output,Elset=All,File Name=abc,Frequency=50,Output File=User Defined,Stiffness=Yes 计算完后可以在工作目录下找到文件名为ABC.mtx的 单元刚度矩阵 的结果文件 ,共50步,全部 输出 的 单元刚度矩阵 有600M,这是一个很大的 数据 ,所以要把不需要的删除。并且在打开这个600M大的文件时发现,UntraEdit比记事本和写字板的打开速度快得多!假如共50步,我只想要最后一步的 单元刚度矩阵 ,那么可以设定 FREQUENCY=50,设定FREQUENCY=0表示不 输出 ,默认为每一步都 输出 。 其次可以设定结果文件名,设定时要使用OUTPUT FILE=USER DEFINED这个选项,将FILE NAME的值设定为想要的文件名,注意不要扩展名。 例如: *Elset, Elset=All, Generate 1,1800,1 *File Format,Ascii *Element Matrix Output,Elset=All,File Name=abc,Frequency=50,Output File=User Defined,Stiffness=Yes 计算完后可以在工作目录下找到文件名为ABC.mtx的 单元刚度矩阵 的结果文件
3253 次阅读|0 个评论
[转载]c(++)中的移位操作符介绍
xiaoxinghe 2012-3-24 21:39
From:http://blog.sina.com.cn/s/blog_4ff373440100vvub.html  移位时,移出的位数全部丢弃,移出的空位补入的数与左移还是右移花接木有关。如果是左移,则规定补入的数全部是0;如果是右移,还与被移位的数据是否带 符号有关。若是不带符号数,则补入的数全部为0;若是带符号数,则补入的数全部等于原数的最左端位上的原数(即原符号位)。具体移位规则如下所示。  位移位运算符的优先级如下:    ·算术运算符 优先于 位移位运算符 优先于 关系运算符    ·位移位运算符是同级别的,结合性是自左向右   例如,设无符号短整型变量a为0111(对应二进制数为0000000001001001),    则:a3 结果为01110(对应二进制数为0000001001001000),a不变 (左移)      a4 结果为04 (对应二进制数为0000000000000100),a不变 (右移)   又如,设短整型变量a为-4(对应二进制数为1111111111111100),    则:a3 结果为-32(对应二进制数为1111111111100000),a不变      a4 结果为-1(对应二进制数为1111111111111111),a不变 先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用运算符.例如: int i = 1; i = i 2; //把i里的值左移2位 也就是说,1的2进制是000...0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成000... 0100,也就是10进制的4,所以说左移1位相当于乘以2,那么左 移n位就是乘以2的n次方了 (有符号数不完全适用,因为左移有可能导致符号变化,下面解释原因) 需要注意的一个问题是 int类型 最左端的符号位和移位移出去的情况.我们知道,int是有符号的整形数, 最左端的1位是符号位,即0正1负 ,那么移位的时候就会出现溢出,例如: int i = 0x40000000; //16进制的40000000,为2进制的01000000...0000 i = i 1; 那么,i在左移1位之后就会变成0x80000000,也就是2进制的100000...0000,符号位被置1,其他位全是0,变成了int类型所能表 示的最小值,32位的int这个值是-2147483648,溢出.如果再接着把i左移1位会出现什么情况呢?在C语言中采用了丢弃最高位的处理方法,丢 弃了1之后,i的值变成了0. 左移里一个比较特殊的情况是当左移的位数超过该数值类型的最大位数时,编译器会用左移的位数去模类型的最大位数,然后按余数进行移位,如: int i = 1, j = 0x80000000; //设int为32位 i = i 33; // 33 % 32 = 1 左移1位,i变成2 j = j 33; // 33 % 32 = 1 左移1位,j变成0,最高位被丢弃 在用gcc编译这段程序的时候编译器会给出一个warning,说左移位数=类型长度.那么实际上i,j移动的就是1位,也就是332后的余数.在gcc下是这个规则,别的编译器是不是都一样现在还不清楚. 总之 左移 就是: 丢弃最高位,0补最低位 再说右移,明白了左移的道理,那么右移就比较好理解了. 右移的概念和左移相反,就是往右边挪动若干位,运算符是. 右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变,例如: int i = 0x80000000; i = i 1; //i的值不会变成0x40000000,而会变成0xc0000000 就是说 ,符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移.同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位. 负数10100110 5(假设字长为8位),则得到的是 11111101 总之, 在C中, 左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变 .实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多. 在很多系统程序中常要求在位(bit)一级进行运算或处理。C语言提供了位运算的功能, 这使得C语言也能像汇编语言一样用来编写系统程序。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 操作符 作用 ──────────────────────────── 位逻辑与 | 位逻辑或 ^ 位逻辑异或 - 位逻辑反 右移 左移 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
个人分类: 程序语言|1867 次阅读|0 个评论
[转载]Windows“科学型计算器”在十进制小数到二进制小数的简单转换
chzg99 2012-3-8 15:32
学习过《计算机基础》的都知道: Windows 科学型计算器只能直接完成十进制 、 二进制 、 八进制及十六进制数之间的整数转换。要用它完成带小数的进位制数互相转换,必须通过适当变换原数后才能实现,其本质是进行小数点位置移动。这里以十进制小数与二进制小数互换为例进行介绍。 二进制数的特点是:进位基数为 2 ,满 2 必须向高位进 1 ,高位借 1 应当 2 用。十进制进位基数为 10 ,含义是缝 10 向高位进 1 ,高位借 1 当 10 使用;十进制小数,其小数点向右移动一位原数扩大 10 倍,移动两位原数,扩大 100 倍,……;二进制数小数点向右移动一位原数扩大 2 倍,小数点移动两位原数扩大 4 倍,……,小数点向右移动 n 位,原数应扩大 2 n 。这样能过小数点位置的移动可以用 Windows 科学型计算器来完成带小数的进位制转换。 具体方法是:打开 Windows “科学型计算器” , 先切换进位制数为十进制,输入十进制带小数的数,如: 876.1234 ,假设我们只保留转换后的二进制数小数为 3 位,则把十进制原数 876.1234 × 8=7008.9872 ,将所得结果转换为二进制数,系统自动省略小数部分 0. 9872 ,只把整数 7008 转换为二进制数,即 1101101100000B 。然后,只要把该二进制数的小数点在向左移三位即得所求了。 876.1234=1101101100.000B 此例太特殊(小数部分给小了),重看一例:把带小数的十进制数 9012.863 转换为带小的二进制数(保留小数四位)。 9012 . 863 × 16=144205.808=10001100110100.1101B 反过来二进制又怎样变换为十进制呢? 方法是:二进制小数的小数点向右移多少位所得数转换为十进制数后再除以 2 的多少次方。 如: 1110001010.110111B → ( 小数点移 6 位 )1110001010110111B 后转换为十进制数是 58039 ,该数再除以 2 6 即得所求。 1110001010.110111B=58039 ÷ 2 6 =906.859375 。
个人分类: 信息安全|7588 次阅读|0 个评论
[转载]如何安装多个版本gcc
shixuanlv305 2012-3-4 13:54
目前,GCC可以用来编译C/C++、FORTRAN、JAVA、OBJC、ADA等语言 的程序,可根据需要选择安装支持的语言。GCC 3.4.0比以前版本更好地支持了C++标准。本文以在Redhat Linux上安装GCC3.4.0为例,介绍了GCC的安装过程。 安装之前,系统中必须要有cc或者gcc等编译器,并且是可用的,或者用环境变量CC指定系统上的编译器。如果系统上没有编译器,不能安装源代码形式的 GCC 3.4.0。如果是这种情况,可以在网上找一个与你系统相适应的如RPM等二进制形式的GCC软件包来安装使用。本文介绍的是以源代码形式提供的GCC软 件包的安装过程,软件包本身和其安装过程同样适用于其它Linux和Unix系统。 系统上原来的GCC编译器可能是把gcc等命令文件、库文件、头文件等分别存放到系统中的不同目录下的。与此不同,现在GCC建议我们将一个版本的GCC 安装在一个单独的目录下。这样做的好处是将来不需要它的时候可以方便地删除整个目录即可(因为GCC没有uninstall功能);缺点是在安装完成后要 做一些设置工作才能使编译器工作正常。在本文中我采用这个方案安装GCC 3.4.0,并且在安装完成后,仍然能够使用原来低版本的GCC编译器,即一个系统上可以同时存在并使用多个版本的GCC编译器。 按照本文提供的步骤和设置选项,即使以前没有安装过GCC,也可以在系统上安装上一个可工作的新版本的GCC编译器。 1. 下载 在GCC网站上( http://gcc.gnu.org/ )或者通过网上搜索可以查找到下载资源。目前GCC的最新版本为 3.4.0。可供下载的文件一般有两种形式:gcc-3.4.0.tar.gz和gcc-3.4.0.tar.bz2,只是压缩格式不一样,内容完全一致,下载其中一种即可。 2. 解压缩 根据压缩格式,选择下面相应的一种方式解包(以下的“%”表示命令行提示符): % tar xzvf gcc-3.4.0.tar.gz 或者 % bzcat gcc-3.4.0.tar.bz2 | tar xvf - 新生成的gcc-3.4.0这个目录被称为源目录,用${srcdir}表示它。以后在出现${srcdir}的地方,应该用真实的路径来替换它。用pwd命令可以查看当前路径。 在${srcdir}/INSTALL目录下有详细的GCC安装说明,可用浏览器打开index.html阅读。 3. 建立目标目录 目标目录(用${objdir}表示)是用来存放编译结果的地方。GCC建议编译后的文件不要放在源目录${srcdir]中(虽然这样做也可以),最好单独存放在另外一个目录中,而且不能是${srcdir}的子目录。 例如,可以这样建立一个叫 gcc-build 的目标目录(与源目录${srcdir}是同级目录): % mkdir gcc-build % cd gcc-build 以下的操作主要是在目标目录 ${objdir} 下进行。 4. 配置 配置的目的是决定将GCC编译器安装到什么地方(${destdir}),支持什么语言以及指定其它一些选项等。其中,${destdir}不能与${objdir}或${srcdir}目录相同。 配置是通过执行${srcdir}下的configure来完成的。其命令格式为(记得用你的真实路径替换${destdir}): % ${srcdir}/configure --prefix=${destdir} 例如,如果想将GCC 3.4.0安装到/usr/local/gcc-3.4.0目录下,则${destdir}就表示这个路径。 在我的机器上,我是这样配置的: % ../gcc-3.4.0/configure --prefix=/usr/local/gcc-3.4.0 --enable-threads=posix --disable-checking --enable--long-long --host=i386-redhat-linux --with-system-zlib --enable-languages=c,c++,java 将GCC安装在/usr/local/gcc-3.4.0目录下,支持C/C++和JAVA语言,其它选项参见GCC提供的帮助说明。 5. 编译 % make 这是一个漫长的过程。在我的机器上(P4-1.6),这个过程用了50多分钟。 6. 安装 执行下面的命令将编译好的库文件等拷贝到${destdir}目录中(根据你设定的路径,可能需要管理员的权限): % make install 至此,GCC 3.4.0安装过程就完成了。 6. 其它设置 GCC 3.4.0的所有文件,包括命令文件(如gcc、g++)、库文件等都在${destdir}目录下分别存放,如命令文件放在bin目录下、库文件在 lib下、头文件在include下等。由于命令文件和库文件所在的目录还没有包含在相应的搜索路径内,所以必须要作适当的设置之后编译器才能顺利地找到 并使用它们。 6.1 gcc、g++、gcj的设置 要想使用GCC 3.4.0的gcc等命令,简单的方法就是把它的路径${destdir}/bin放在环境变量PATH中。我不用这种方式,而是用符号连接的方式实现,这样做的好处是我仍然可以使用系统上原来的旧版本的GCC编译器。 首先,查看原来的gcc所在的路径: % which gcc 在我的系统上,上述命令显示:/usr/bin/gcc。因此,原来的gcc命令在/usr/bin目录下。我们可以把GCC 3.4.0中的gcc、g++、gcj等命令在/usr/bin目录下分别做一个符号连接: % cd /usr/bin % ln -s ${destdir}/bin/gcc gcc34 % ln -s ${destdir}/bin/g++ g++34 % ln -s ${destdir}/bin/gcj gcj34 这样,就可以分别使用gcc34、g++34、gcj34来调用GCC 3.4.0的gcc、g++、gcj完成对C、C++、JAVA程序的编译了。同时,仍然能够使用旧版本的GCC编译器中的gcc、g++等命令。 6.2 库路径的设置 将${destdir}/lib路径添加到环境变量LD_LIBRARY_PATH中,最好添加到系统的配置文件中,这样就不必要每次都设置这个环境变量了。 例如,如果GCC 3.4.0安装在/usr/local/gcc-3.4.0目录下,在RH Linux下可以直接在命令行上执行或者在文件/etc/profile中添加下面一句: setenv LD_LIBRARY_PATH /usr/local/gcc-3.4.0/lib:$LD_LIBRARY_PATH 7. 测试 用新的编译命令(gcc34、g++34等)编译你以前的C、C++程序,检验新安装的GCC编译器是否能正常工作。 8. 根据需要,可以删除或者保留${srcdir}和${objdir}目录。
个人分类: 编程|0 个评论
信息基本定律(文字和公式;明确其大小前提)
geneculture 2012-1-23 19:43
信息基本定律(文字和公式): 第一定律:本真信息存在公理揭示Id=n•n在特定域内基因文本即单一集合的元素之间的序位关系是唯一守恒的(人机通用), 第二定律:就特定的基因文本进化演变而来的组合变换的各级广义文本的进阶层式即分层集合的元组之间可做到同义并列对应转换即满足Id=Ik+Iu的约束条件就可建立一一对应的函数关系(人际、人机、机际、机人之间可传递信息信息), 第三定律:就特定的学科、领域、行业的子域(包含子全域和超子域)的具体形式信息对应的内容信息如何进一步化解歧义而言,可用从杂多集合中提炼或抽取标志集合的内容信息处理方式来达到具体排除歧义的目的即采用约定俗成和彼此同意的方式来筛选可满足Ik+Iu=m.m与Iu=Id-Ik的约束条件就可建立同意并列对应转换的协议关系。 信息基本定律( 明确其大小前提) 明确两个具有大小前提作用的信息基本定律 http://idea.cas.cn/viewudoc.action?docid=3062 提交时间:2011-12-21 20:40:15 提交用户:geneculture 本文 旨在 明确两个具有大小前提作用的信息基本定律。 为了避免理解上的歧义,其论证 方法 及描述形式仅采用0和1两个 二进制数 组成的 形式语言 。 其具体的 描述、论证 和 结果 如下: 定义0:把克莱尼星号“Σ*”表示的字符集{ε,0,1,00,01,10,11,000,001,010,011,…}命名为“ 杂多集合 ”。其中,“杂”描述其性质的复杂;“多”描述其数量的巨大。 定义1:把定义0所述字符集蕴含的单一元素“0”和“1”抽取出来构成一个最简单的集合,即:{0,1},并把它命名为“ 单一集合 ”。其中,“单”描述其性质的简单;“一”描述其数量的唯一。 定义2:把根据定义1所述“单一集合”元素,无论是0还是1,按其个数分层并逐一递增排列,从而,便可构造出一系列的进化形式,简称:进阶层式,如:第零进阶层式“0,1”;第一进阶层式“00,01,10,11”;第二进阶层式“000,011,010,001,100,101,110,111”;...;总称“ 分层集合 ”。 定理1 :定义1和定义2所描述的两类理想集合,其元素以及进阶层式及其成员之间的关系,均满足“异义排列序趣简美”或“ 序位关系唯一守恒 ”法则(具有大前提作用的 第一信息基本定律 )。 定义3:根据任意标志,如:“0”,“1”,“01”,“10”,...,...,即可由用户(自然人)或其代理(计算机)从定义3所述“分层集合”中选取“进阶层式”的“成员”重新组合成“ 标志集合 ”,如:含“0”这个标志的集合{0,00,000,...}或含“1”这个标志的集合{1,11,111,...}等等。 定理2 :定义3所述的任意两个标志集合之间,只要符合“同义并列”的条件,如:含“0”这个标志的集合{0,00,000,...}与含“1”这个标志的集合{1,11,111,...}之间,等等,即可根据定理1而实现“对应转换”。这就是“ 同义并列对应转换 ”法则(具有小前提作用的 第二信息基本定律 )。 进一步的 探讨 或 议论 : 如果以上定义1-3所描述的是三类 理想集合 的可计算示例,那么,便可把定义1-3所描述的 抽象类 分别 命名为 :物之理,如:开关电路的物理;数之理,如:虚拟的开关电路的数理;意之义,或:文之法,如:用户(自然人)或其代理(计算机)依据逻辑语义或形式文法所做的一系列选择依据。 进而 可概括出 两个基本序列,即: 广义文本 ( 第二信息基本定律 发挥作用的地方)与其所遵循的 序位法则 ( 第一信息基本定律 得以体现的地方);四个基本范畴。即:物、意、文;理(或义或法),可由一个几何模型(即:三棱锥,或:四面体)加以直观表达。
个人分类: 信息学基础研究|1459 次阅读|0 个评论
回楼主的一个帖子
热度 2 andrewwang 2012-1-17 22:15
以前我在上初中的时候就想过,为什么基本的运算方式就只有”加减乘除“四种呢,而且加减、乘除都是相互的逆运算,所以根本上就只有加法和乘法两种。其余的运算还有幂运算,但是幂运算最终还是要转换成四则运算才能进行计算,因此幂运算只是一种记法。 上大学学习了计算机原理,学习CPU的结构,知道计算机实现运算还是以二进制实现基本的半加器电路开始,再以各种技巧组建出全加器、乘法器、甚至硬件除法电路(浮点数运算电路也一直CPU设计的难点)。应用计算机进行编程时,所有的运算都必须转换成四则运算才能交给CPU直接执行。因此我更加确定了四则运算的基础地位。 关于加法和乘法的关系,我觉得”乘法是加法的简单记法“这种说法并没有错,从整数乘法来看,这是直接和明显的。但对于浮点数(小数)而言,累加的意义就不太明显,比如0.167×0.333,也许我们可以把小数转换成分数理解成167÷100×333÷100,也是行得通的。 我觉得因果关系应该算是一种逻辑运算,至少在计算机语言中是这样的,有逻辑关系的两个断言才能说他们具有因果关系。 至于为什么楼主说乘法运算能产生因果关系,我看了也实在不能理解也想不通。 大学里还有一些课程是模仿”代数系统“的四则运算来进行构造的,比如矩阵运算、泛函运算等,我觉得都有一些模仿,当然其本身也是很大的创造。 看过一些科技哲学的书籍,讲到数学的本质的时候,大家都会陷入形而上学的玄境。我比较认同的一种观点是,“数学并不涉及到绝对真理或者部分真理,它只涉及到假言真理,即从什么样的前提和演绎方法能得到什么结论。数学本质是构造性的。” 这样来看,以四则计算为基础的代数系统并没有特殊性,虽然它是最直观、最古老的,容易被我们理解。 我博客里面有个转的“数学有什么用”的帖子,其中讲到了现代数学的种种分支。其中讲到”数论“这一主题是,作者认为奥秘无穷,人脑根本不够用,并举“哥德巴赫猜想”的例子来佐证。数论论的就是代数系统。 我大胆猜想,我们地球人之所以用代数系统发展数学和科学,也许是对应我们人类的物理结构或者大脑结构。据说有种外星人是通过心灵感应进行交流的,思考世界也是完全跟我们不一样,他们也不用四则运算。
998 次阅读|3 个评论
明确具有大小前提作用的两个信息基本定律
geneculture 2011-12-22 10:08
明确具有大小前提作用的两个信息基本定律
本文 旨在 明确具有大小前提作用的两个信息基本定律。 为了避免理解上的歧义,其论证 方法 及描述形式仅采用0和1两个二进制数组成的形式语言。 其具体的描述、论证和 结果 如下: 定义0 :把 克莱尼星号 “Σ*”表示的 字符集 {ε,0,1,00,01,10,11,000,001, 010,011,…}命名为“ 杂多集合 ”。其中,“杂”描述其性质的复杂;“多”描述其数量的巨大。 定义1 :把定义0所述字符集蕴含的单一元素“0”和“1”抽取出来构成一个最简单的集合,即:{0,1},并把它命名为“ 单一集合 ”。其中,“单”描述其性质的简单;“一”描述其数量的唯一。 定义2 :把根据定义2所述“单一集合”元素,无论是0还是1,按其个数分层并逐一递增排列,从而,便可构造出一系列的进化形式,简称: 进阶层式 ,如:第零进阶层式“0,1”;第一进阶层式“00,01,10,11”;第二进阶层式“000,011,010,001,100,101,110,111”;...;总称“ 分层集合 ”。 定理1 :定义1和定义2所描述的两类 理想集合 ,其元素以及进阶层式及其成员之间的关系,均满足“异义排列序趣简美”或“序位关系唯一守恒”法则(具有 大前提 作用的 第一信息基本定律 )。 定义3 :根据任意标志,如:“0”,“1”,“01”,“10”,...,...,即可由用户(自然人)或其代理(计算机)从定义3所述“分层集合”中选取“进阶层式”的“成员”重新组合成“ 标志集合 ”,如:含“0”这个标志的集合{0,00,000,...}或含“1”这个标志的集合{1,11,111,...}等等。 定理2 :定义3所述的任意两个标志集合之间,只要符合“同义并列”的条件,如:含“0”这个标志的集合{0,00,000,...}与含“1”这个标志的集合{1,11,111,...}之间,等等,即可根据定理1而实现“对应转换”。这就是“同义并列对应转换”法则(具有 小前提 作用的 第二信息基本定律 )。 进一步的 探讨 或 议论 : 如果以上定义1-3所描述的是三类 理想集合 的 可计算 示例,那么,便可把定义1-3所描述的 抽象类 分别命名为: 物之理 ,如:开关电路的 物理 ; 数之理 ,如:虚拟的开关电路的 数理 ;意之义,或:文之法,如:用户(自然人)或其代理(计算机)依据 逻辑语义 或 形式文法 所做的一系列 选择依据 。 进而可概括出 两个基本序列 ,即: 广义文本 ( 第二信息基本定律 发挥作用的地方)与其所遵循的 序位法则 ( 第一信息基本定律 得以体现的地方); 四个基本范畴 ,即: 物、意、文、理 (或“ 义 ”或“ 法 ”),可由一个 几何模型 (即: 三棱锥 ,或: 四面体 )加以直观表达。 参考文献 邹晓辉. 间接计算模型和间接形式化方法 . 软件 . 2011(05) 邹晓辉.信息学基础研究 《信息科学交叉研究》 浙江教育出版社 2007年 ISBN 9787533870911 附录1 信息科学交叉研究(电子版) 附录2 分享 The Meaning of the Information Model 2010-8-10 19:58 on Knowledge Management in University by Zou Xiao Hui at FIS2010 Dao or Tao(道) at the core of the interfaceand its operating system for bilingual computer interface designed by Zou Xiao Hui The View in Linguistics( ... 附图
个人分类: 信息学基础研究|1393 次阅读|0 个评论
[转载]用 Python 的输入输出功能读取和写入数据
ywmucn 2011-12-18 01:30
close()关闭文件对象 flush()刷新文件的缓冲区。缓冲区包含等待写入或文件中读取的信息。“刷新“就是执行实际的读取或写入操作 isatty()如果文件对象是tty(终端)设备,就返回1 read( ) 从文件中读取数据。 readline( )从文件中读取一行 readlines( ) 从文件中读取多行 seek(offset ) 使文件位置移动offset个字节。如果没有指定location,文件位置从文件起始处移动。如是指定了location,就从指定位置移动。 tell()返回文件的当前位置 truncate( ) 删除文件中的数据。如果没有指定size,就删除所有数据;如果指定了size,就最多只删除指定的字节数。 write(output) 将字符串output写入文件 writeline(outputlist) 将outputlist中的每个字符串写入文件 writelines() 写入多行数据 转自: http://www.ibm.com/developerworks/cn/opensource/os-python8/ 简介: 在这篇文章中,将学习如何处理文件。首先,回顾一种使用 Python 输出数据的简单方式,然后学习文件对象,Python 程序用它从文件读取数据和把数据写入文件。将演示打开文件的不同模式,最后将显示如何读取和写入二进制文件。 读取、写入和 Python 在 “ 探索 Python ” 系列以前的文章中,学习了基本的 Python 数据类型和一些容器数据类型,例如 tuple 、 string 和 list 。其他文章讨论了 Python 语言的条件和循环特性,以及它们如何与容器数据类型进行协作来简化编程任务。编写程序的最后一个基本步骤就是从文件读取数据和把数据写入文件。阅读完这篇文章之后,可以在自己的 to-do 列表中加上检验这个技能学习效果的任务。 简单输出 贯穿整个系列,一直用 print 语句写入(输出)数据,它默认把表达式作为 string 写到屏幕上(或控制台窗口上)。清单 1 演示了这一点。清单 1 重复了第一个 Python 程序 “Hello, World!” ,但是做了一些小的调整。 清单 1. 简单输出 print "Hello World!" Hello World! print "The total value is = $", 40.0*45.50 The total value is = $ 1820.0 print "The total value = $%6.2f" % (40.0*45.50) The total value = $1820.00 myfile = file("testit.txt", 'w') print myfile, "Hello World!" print myfile, "The total value = $%6.2f" % (40.0*45.50) myfile.close() 正如这个示例演示的,用 print 语句写入数据很容易。首先,示例输出一个简单的 string 。然后创建并输出复合的 string ,这个字符串是用 string 格式化技术创建的。 但是,在这之后,事情发生了变化,与代码以前的版本不同。接下来的一行创建 file 对象,传递进名称 "testit.txt" 和 'w' 字符(写入文件)。然后使用修改过的 print 语句 —— 两个大于号后边跟着容纳 file 对象的变量 —— 写入相同的 string 。但是这一次,数据不是在屏幕上显示。很自然的问题是:数据去哪儿了?而且,这个 file 对象是什么? 第一个问题很容易回答。请查找 testit.txt 文件,并像下面那样显示它的内容。 % more testit.txt Hello World! The total value = $1820.00 可以看到,数据被准确地写入文件,就像以前写到屏幕上一样。 现在,请注意清单 1 中的最后一行,它调用 file 对象的 close 方法。在 Python 程序中这很重要,因为在默认情况下,文件输入和输出是 缓冲的 ;在调用 print 语句时,数据实际未被写入;相反,数据是成批写入的。让 Python 把数据写入文件的最简单方式就是显式地调用 close 方法。 文件对象 file 是与计算机上的文件进行交互的基本机制。可以用 file 对象读取数据、写入数据或把数据添加到文件,以及处理二进制或文本数据。 学习 file 对象的最简单方法就是阅读帮助,如清单 2 所示。 清单 2. 得到 file 对象的帮助 help(file) Help on class file in module __builtin__: class file(object) | file(name ]) - file object | | Open a file. The mode can be 'r', 'w' or 'a' for reading (default), | writing or appending. The file will be created if it doesn't exist | when opened for writing or appending; it will be truncated when | opened for writing. Add a 'b' to the mode for binary files. | Add a '+' to the mode to allow simultaneous reading and writing. | If the buffering argument is given, 0 means unbuffered, 1 means line | buffered, and larger numbers specify the buffer size. | Add a 'U' to mode to open the file for input with universal newline | support. Any line ending in the input file will be seen as a '\n' | in Python. Also, a file so opened gains the attribute 'newlines'; | the value for this attribute is one of None (no newline read yet), | '\r', '\n', '\r\n' or a tuple containing all the newline types seen. | | 'U' cannot be combined with 'w' or '+' mode. | | Note: open() is an alias for file(). | | Methods defined here: ... 正如帮助工具指出的,使用 file 对象很简单。用 file 构造函数或 open 方法创建 file 对象, open 是 file 构造函数的别名。第二个参数是可选的,它指定文件的使用方式: 'r' (默认值)表示从文件读取数据。 'w' 表示要向文件写入数据,并截断以前的内容。 'a' 表示要向文件写入数据,但是添加到当前内容尾部。 'r+' 表示对文件进行读写操作(删除以前的所有数据)。 'r+a' 表示对文件进行读写操作(添加到当前内容尾部)。 'b' 表示要读写二进制数据。 这篇文章的第一个代码清单向文件写入数据。现在,清单 3 显示如何把这个数据读入 Python 程序,并解析文件的内容。 清单 3. 从文件读取数据 myfile = open("testit.txt") myfile.read() 'Hello World!\nThe total value = $1820.00\n' str = myfile.read() print str myfile.seek(0) str = myfile.read() print str Hello World! The total value = $1820.00 str.split() str.split('\n') for line in str.split('\n'): ... print line ... Hello World! The total value = $1820.00 myfile.close() 要读取数据,首先要创建合适的 file 对象 —— 在这个示例中,文件对象打开 testit.txt 文件,并用 read 方法读取内容。这个方法把整个文件读入一个 string ,然后在程序中把这个字符串输出到控制台。在对 read 方法的第二个调用中,试图把值分配给 str 变量,结果返回一个空的 string 。这是因为第一个 read 操作读入了整个文件。当试图再次读取内容时,已经到了文件末尾,所以什么也读不到。 这个问题的解决方案也很简单:让 file 对象返回文件的开头。回到开头要通过 seek 方法进行,它接受一个参数,表示要从文件中的什么位置开始读取或写入(例如, 0 代表文件开头)。 seek 方法支持更复杂的操作,但是可能会有危险。对于目前来说,我们还坚持采用简单方式。 现在回到了文件的开始之处,可以把文件内容读入 string 变量并对 string 做适当地解析。请注意,在文件中,行之间用新行(或行结束)字符区分。如果试着在 string 上调用 split 方法,它会在空白字符(例如空格)处进行拆分。为了让方法根据新行字符拆分各行,必须显式地指定新行字符。然后可以拆分 string 并在 for 循环中对文件的行进行迭代。 看起来仅仅从文件中读取和处理一行内容都有许多工作要做。 Python 要让简单的事情变容易,所以您可能想知道这个任务有没有快捷方式可用。如清单 4 所示,答案是 yes 。 清单 4. 读取和解析行 myfile = open("testit.txt") for line in myfile.readlines(): ... print line ... Hello World! The total value = $1820.00 myfile.close() for line in open("testit.txt").readlines(): ... print line ... Hello World! The total value = $1820.00 for line in open("testit.txt"): ... print line ... Hello World! The total value = $1820.00 清单 4 演示了读取和解析文本文件行的三种技术。首先,打开文件并把它分配给变量。然后调用 readlines 方法,把整个文件读入内存并把内容拆分成 string 列表。 for 循环在 string 列表上进行迭代,一次输出一行。 第二个 for 循环通过使用 file 对象的隐式变量(也就是说,变量不是显式创建的),对这个过程稍做了点儿简化。打开文件和读取文件内容一次完成,生成的效果与第一个显式示例相同。最后一个示例进一步做了简化,并演示了直接在 file 对象上进行迭代的能力(请注意,这是 Python 的一个新特性,所以在您的计算机上可能无法工作)。在这个示例中,创建隐式 file 对象,然后 Python 做余下的工作,允许对文件中的全部行进行迭代。 但是,有些时候,在从文件读取数据时,可能想要更好的控制级别。在这种情况下,应当使用 readline 方法,如清单 5 所示。 清单 5. 读取数据 myfile = open("testit.txt") myfile.readline() 'Hello World!\n' myfile.readline() 'The total value = $1820.00\n' myfile.readline() '' myfile.seek(0) myfile.readline() 'Hello World!\n' myfile.tell() 13L myfile.readline() 'The total value = $1820.00\n' myfile.tell() 40L myfile.readline() '' myfile.tell() 40L myfile.seek(0) myfile.read(17) 'Hello World!\nThe ' myfile.seek(0) myfile.readlines(23) myfile.close() 这个示例演示了如何在文件中移动,一次读取一行,或者显式地用 seek 方法移动文件位置指示器。首先,用 readline 方法在文件行中移动。当到达文件末尾时, readline 方法返回一个空的 string 。在过了文件末尾之后,如果还用这种方式继续读取,并不会造成错误,只会返回空的 string 。 然后返回文件开始的地方,并读取另一行。 tell 方法显示出在文件中的当前位置(应当在第一行文本之后) —— 在这个示例中,在第 13 个字符位置。通过使用这个知识,可以向 read 或 readline 方法传递一个参数,控制读取的字符数。对于 read 方法,这个参数(在这个示例中是 17 )是要从文件中读取的字符数。但是 readline 方法在读入指定数量的字符后,还会继续读取,直到行尾。在这个示例中,它读取第一行和第二行文本。 写入数据 迄今为止的示例都侧重于读取数据,而不是写入数据。但是如清单 6 所示,一旦了解了使用 file 对象的基础知识,写入也很容易。 清单 6. 写入数据 mydata = myfile = open('testit.txt', 'w') for line in mydata: ... myfile.write(line + '\n') ... myfile.close() myfile = open("testit.txt") myfile.read() 'Hello World!\nThe total value = $1820.00\n' myfile.close() myfile = open("testit.txt", "r+") for line in mydata: ... myfile.write(line + '\n') ... myfile.seek(0) myfile.read() 'Hello World!\nThe total value = $1820.00\n' myfile.close() myfile = open("testit.txt", "r+a") myfile.read() 'Hello World!\nThe total value = $1820.00\n' for line in mydata: ... myfile.write(line + '\n') ... myfile.seek(0) myfile.read() 'Hello World!\nThe total value = $1820.00\nHello World!\nThe total value = $1820.00\n' myfile.close() 要把数据写入文件,必须先创建 file 对象。但是,在这情况下,必须用 'w' 模式标记指定要写入文件。在这个示例中,把 mydata list 的内容写入文件,关闭文件,然后重新打开文件,这样就可以读取内容了。 但是,通常情况下,想要同时读取文件和写入文件,所以这个示例的下一部分用 'r+' 模式重新打开文件。因为能够写入文件,而不是添加,所以文件会被截断。首先,把 mydata list 的内容写入文件,然后把文件指针重新定位到文件开头,并读入内容。然后这个示例关闭文件,并用读取和添加模式 "r+a" 重新打开文件。正如示例代码所示,文件内容现在是两个写入操作的结果(文本是重复的)。 处理二进制数据 前面所有的示例都处理文本数据或字符数据:写入和读取字符 string 。但是,在某些情况下,例如在处理整数或压缩文件时,需要能够读取和写入二进制数据。在创建 file 对象时,通过把 'b' 添加到文件模式中,可以很容易地用 Python 处理二进制数据,如清单 7 所示。 清单 7. 处理二进制数据 myfile = open("testit.txt", "wb") for c in range(50, 70): ... myfile.write(chr(c)) ... myfile.close() myfile = open("testit.txt") myfile.read() '23456789:;=?@ABCDE' myfile.close() 在这个示例中,创建一个合适的 file 对象,然后用从 50 到 69 的 ASCII 值写入二进制字符。使用 chr 方法,把 range 方法调用创建的整数转变成字符。在写完所有数据之后,关闭文件并重新打开文件进行读取,还是使用二进制模式标记。读取文件可以证明没有把整数写入文件,相反,写的是字符值。 在读取和写入二进制数据时,必须小心,因为不同的平台用不同的方式保存二进制数据。如果必须处理二进制数据,最好是使用来自 Python 库的合适对象(或者来自第三方开发人员的对象)。 回页首 读取和写入:最有趣的地方 这篇文章讨论了在 Python 程序中如何从文件读取数据和写入数据到文件中。总体来说,过程很简单:创建合适的 file 对象,然后按照需要读取和写入。但是,在使用写入模式创建 file 文件,向文件写入数据时,必须注意文件的截断。如果需要向文件中添加数据,应当在创建 file 对象时,使用添加模式。 参考资料 学习 您可以参阅本文在 developerWorks 全球站点上的 英文原文 。 请阅读 developerWorks “ 探索 Python ” 系列的全部文章。 如果已经有了可以工作的 Python 解释器, Python tutorial 是开始学习该语言的好地方。 请访问 developerWorks 开放源码专区 获得全面的 how-to 信息、工具和项目更新,帮助您用开放源码技术进行开发,并把它们用于 IBM 的产品。 获得产品和技术 请下载 Python 。 请用 IBM 试用软件 革新您的下一个开放源码开发项目,可以下载或在 DVD 上得到。 讨论 参与 developerWorks blogs ,加入 developerWorks 社区。 关于作者 Robert J. Brunner 是国家超级计算应用中心的研究科学家和伊利诺斯 Urbana-Champaign 大学的助理天文学教授。他出版了多部著作
个人分类: 脚本|4134 次阅读|0 个评论
Linux软件安装简单分类汇总
liujd 2011-11-19 12:03
Linux软件安装 一、二进制软件的安装 1,rpm形式的二进制 安装: rpm -ivh packagename.rpm 可以指定安装位置 rpm -ivh --relocate /=/opt/gaim gaim-1.3.0-1.fc4.i386.rpm 卸载: rpm -e packagename 或者强制 rpm -e –nodeps packagename i为安装;v校验;h散列检验 2,tar,gz/*.tgz,bz2形式可执行的二进制软件包 安装: 解压tar zxvf *.tar.gz tar jxvf *.bz2 即可 卸载: 手动删除 3,提供非rpm的安装包 执行 install或者 install.sh 二、源码安装 1,rpm形式的源码(*.src.rpm)安装 方式一:rpm形式提供源码,但是中间生成的是非rpm形式的安装包 1 )生成源码 a)rpm -i packagename.src.rpm 这一步将会把源码解压到固定的位置(/usr/src/redhat/SPECS),得到源码文件package.specs b)rpmbuild -bp packagename.specs 这一步会把源码文件展开成原始目录,后续工作和*.tar.gz或者*.tar.bz2源码安装一致。 2 )编译源码、安装非rpm二进制安装包,需要编译、安装 a ) ./configure 进入生成的目录文件,执行./configure 这里可以指定安装位置:./configure --prefix=/usr/local b)make c)make install d)make clean 方式二:rmp形式提供源码,生成rpm二进制安装包,不需要编译、安装 1) 生成 rpm 安装包 rpm -i packagename.src.rpm 进入/usr/src/redhat/SPECS rpmbuild -bp packagename.specs 这一步会得到rpm文件,不是得到一个目录 2)用 rpm安装 rpm -ivh packagename.rpm 可以在这里更改安装路径: rpm -ivh --relocate /=/opt/gaim gaim-1.3.0-1.fc4.i386.rpm 2,非rpm安装四步骤 *.tar.gz tgz/ bz2 1)解压 2)./configure 这里可以指定安装位置:./configure --prefix=/usr/local 默认的安装位置:/usr/local/bin 3)make 4)make install 5)make clean (清除安装过程中临时文件) 卸载make uninstall 三、yum安装 1,安装和卸载 只要是rpm的软件包都可以。 安装:yum install packagename 卸载:yum remove packagename 2,查询软件信息 1)查找软件包 yum search keyword 2)列出所有可以安装的软件包 yum list 3)可以更新的软件包 yum list update 4)列出指定的软件包 yum list packagename 四、强制无依赖删除软件 1,查找软件 rpm -qa rpm -qa|grep 2,删除软件包 rpm -e packagename 3,强制删除所有软件包 rpm -e - - nodeps packagename 转载别人:关于src.rpm安装!   方法一:   1.执行rpm -i your-package.src.rpm   2. cd /usr/src/redhat/SPECS   3. rpmbuild -bp your-package.specs 一个和你的软件包同名的specs文件   4. cd /usr/src/redhat/BUILD/your-package/ 一个和你的软件包同名的目录   5. ./configure 这一步和编译普通的源码软件一样,可以加上参数   6. make   7. make install   方法二:   1.执行rpm -i you-package.src.rpm   2. cd /usr/src/redhat/SPECS   前两步和方法一相同   3. rpmbuild -bb your-package.specs 一个和你的软件包同名的specs文件   这时,在/usr/src/redhat/RPM/i386/ (根据具体包的不同,也可能是i686,noarch等等)   在这个目录下,有一个新的rpm包,这个是编译好的二进制文件。   执行rpm -i new-package.rpm即可安装完成。
个人分类: linux|1328 次阅读|0 个评论
软件设计和软件工程的双重路径原理及其应用(示例 1 + 示例 2)
热度 2 geneculture 2011-11-19 08:08
软件设计和软件工程的双重路径原理及其应用(示例 1 + 示例 2)
第二路径的思想渊源 第二路径的基本特征 ........................................................................... 双语者自己都可把翻译的工作都担当了,试问:他是否还必须其他人为他充当翻译呢? 第二路径的基本假设 示例 1 软件(机器语言:二进制数)--编译器--程序员--知识工程师--用户(自然语言:英语) 软件(数学语言:十进制数)------------------------------------用户(自然语言:汉语) 示例 2 软件(二进制数)--编译器--(编程语言)程序员--系统设计师--系统分析师--用户(英语) 软件(十进制数)------------------------------------------------------------------用户(汉语) 参考文献 邹晓辉,邹顺鹏. 间接计算模型和间接形式化方法 . 软件. 2011(05):1-5 邹晓辉,邹顺鹏. 协同智能计算系统——理论模型及其应用 . 软件. 2011(06):1-8 邹晓辉,邹顺鹏.软件工程学科何以独特——形式化方法的双重路径 .软件,2011(07):1-14
个人分类: 双语信息处理|1938 次阅读|9 个评论
编程中数据处理的问题(一)浮点数与精度理解
andrewwang 2011-11-7 21:21
编程中一般处理两类数据:一类是简单的事务性的,如一些用于逻辑判断,一些小整数做跳转,等等;另外一些是用于科学计算的,往往在算法设计时要用到。第一类比较好理解。 在科学计算的中,数据的重要性在于数的表示范围和精度。总的来说,计算机中把数据分成两类,一类是整型Integer(包括用于表示字符的char),另一类是浮点型(包括float、double和一些扩展浮点型)。整形数据比较简单,也很好理解,历史上,CPU也是先从支持整型运算开始,后来才到支持浮点运算。 理解数据需要理解“数据在计算机中的表示方式”和“数据的显示”。前者是计算机中数据存储和处理的机制,后者是与人的交互。整型的存储表示很简单,就是一串0和1的组合,有n Byte(8n bits)的数据,可以表示0 — 2^(8n)-1 或者 ±2^(8n-1)-1 的范围。浮点数是另一种表示机制,简单说就是:一部分位表示底数,一部分表示指数,一位表示符号(具体表示方法IEEE有规定)。这样总的二进制有效位数是固定的,指数变化时,小数点在有效位之间浮动,从而可以表示非常大范围的数,在数据不是很大时(指数绝对值不大时),数据的精度也很高。以4 Byte的浮点数为例, 最大正数:(1-2^-23)*2^127, 最小正数:2^-129, 最大负数:-2^-129, 最小负数:-2^127。数据精度是“两头差,中间好”。 值得一提的是,CPU用于实现浮点数存储和运算的机制还是比较复杂的,但是我们只要理解到这一步,知道计算机能够实现浮点数所有正常运算就行了。 下一个问题就是“数据的显示”问题,由于计算机用得时二进制码、补码等形式存储处理浮点数,所以是很不直观的,往往一些大学里的考试题就是给你一串二进制的浮点数,要你把它化成十进制的科学计数法,经常要手算半天。因此,实际计算机在(显示器、语音)显示数据时是用的是人好理解的十进制科学计数法,这其中有从二进制数到十进制的转换。而最终软件显示数据时,还会根据用户的设置显示一定长度的精度。比如实际转换成十进制的浮点数可以有10位的有效数字,而软件只显示5位。 这里有一个问题,就是我们用户怎么方便的来使用程序中的数据。一种方法是直接把数据存成文本格式(ASCII码)这样我们查看数据时比较直观,但是有时候软件输出数据到文本格式时精度会有损失(无论是有意无意的);读取数据时,也是将ASSCII码转换成浮点形式进行运算。 另一种方法是,将数据直接存储成二进制形式,即数据在文件的存储和实际的浮点数表示是相同或者类似的。很多软件选择后者因为这非常方便,省去了与ASCII码转换等等麻烦。但是往往只有专门对应的软件才能读取这种数据了,因为文件中会加入软件特殊的控制信息。例如在matlab (based on Windows) 中,就可以将数据保存成 .txt 格式或者 .mat 格式,分别对应第一种和第二种方法。 总之理解浮点数的存储和运算,就要理解 “数据在计算机中的表示方式”和“数据的显示”这两方面。
1721 次阅读|0 个评论
[转载]为什么计算机用补码存储数据
wqfeng 2011-10-14 09:09
在计算机内部,所有信息都是用二进制数串的形式表示的。整数通常都有正负之分,计算机中的整数分为无符号的和带符号的。无符号的整数用来表示 0 和正整数,带符号的证书可以表示所有的整数。由于计算机中符号和数字一样,都必须用二进制数串来表示,因此,正负号也必须用 0 、 1 来表示。通常我们用最高的有效位来表示数的符号(当用 8 位来表示一个整数时,第 8 位即为最高有效位,当用 16 位来表示一个整数时,第 16 位即为最高有效位。) 0 表示正号、 1 表示负号,这种正负号数字化的机内表示形式就称为“机器数”,而相应的机器外部用正负号表示的数称为“真值”。将一个真值表示成二进制字串的机器数的过程就称为编码。 无符号数没有原码、反码和补码一说。只有带符号数才存在不同的编码方式。 带符号整数有原码、反码、补码等几种编码方式。原码即直接将真值转换为其相应的二进制形式,而反码和补码是对原码进行某种转换编码方式。正整数的原码、反码和补码都一样,负数的反码是对原码的除符号位外的其他位进行取反后的结果(取反即如果该位为 0 则变为 1 ,而该位为 1 则变为 0 的操作)。而补码是先求原码的反码,然后在反码的末尾位加 1 后得到的结果,即补码是反码 +1 。 IBM-PC 中带符号整数都采用补码形式表示。(注意,只是带符号的整数采用补码存储表示的,浮点数另有其存储方式。) 采用补码的原因或好处如下, 采用补码运算具有如下两个特征: 1 )因为使用补码可以将符号位和其他位统一处理,同时,减法也可以按加法来处理,即如果是补码表示的数,不管是加减法都直接用加法运算即可实现。 2 )两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。 这样的运算有两个好处: 1 )使符号位能与有效值部分一起参加运算,从而简化运算规则。从而可以简化运算器的结构,提高运算速度;(减法运算可以用加法运算表示出来。) 2 )加法运算比减法运算更易于实现。使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计。 下面深入分析上面所陈述的采用补码的原因(目的)。 用带符号位的原码进行乘除运算时结果正确 , 而在加减运算的时候就出现了问题,如下: 假设字长为 8bits ( 1 ) 10- ( 1 )10 = ( 1 )10 + ( -1 )10 = ( 0 )10 // 10表示10进制 (00000001) 原 + (10000001) 原 = (10000010) 原 = ( -2 ) 显然不正确 . 。 因为在两个整数的加法运算中是没有问题的,于是就发现问题出现在带符号位的负数身上,对除符号位外的其余各位逐位取反就产生了反码。反码的取值空间和原码相同且一一对应。下面是反码的减法运算: ( 1 )10 - ( 1 ) 10= ( 1 ) 10+ ( -1 ) 10= ( 0 )10 (00000001) 反 + (11111110) 反 = (11111111) 反 = ( -0 ) 有问题。 ( 1 )10 - ( 2)10 = ( 1 )10 + ( -2 )10 = ( -1 )10 (00000001) 反 + (11111101) 反 = (11111110) 反 = ( -1 ) 正确 问题出现在 (+0) 和 (-0) 上,在人们的计算概念中零是没有正负之分的。 于是就引入了补码概念。负数的补码就是对反码加一,而正数不变,正数的原码反码补码是一样的。在补码中用 (-128) 代替了 (-0) ,所以补码的表示范围为: (-128~0~127) 共 256 个。 注意 :(-128) 没有相对应的原码和反码, (-128) = (10000000) 补码的加减运算如下: ( 1 ) 10- ( 1 ) 10= ( 1 )10 + ( -1 )10 = ( 0 )10 (00000001) 补 + (11111111) 补 = (00000000) 补 = ( 0 ) 正确 ( 1 ) 10- ( 2) 10= ( 1 )10 + ( -2 )10 = ( -1 )10 (00000001) 补 + (11111110) 补 = (11111111) 补 = ( -1 ) 正确 采用补码表示还有另外一个原因,那就是为了防止 0 的机器数有两个编码。原码和反码表示的 0 有两种形式 +0 和 -0 ,而我们知道, +0 和 -0 是相同的。这样, 8 位的原码和反码表示的整数的范围就是 -127~+127 ( 11111111~01111111 ),而采用补码表示的时候, 00000000 是 +0 ,即 0 ; 10000000 不再是 -0 ,而是 -128 ,这样,补码表示的数的范围就是 -128~+127 了,不但增加了一个数得表示范围,而且还保证了 0 编码的唯一性。 整数和 0 的原码、反码和补码都相同,下面介绍手工快速求负数补码的方法。这个方法在教材的第 8 页已经提到了,这里再写出来以便能引起大家的注意。其方法如下: 先写出该负数的相反数(正数),再将该正数的二进制形式写出来,然后对这个二进制位串按位取反,即若是 1 则改为 0 ,若是 0 则改为 1 ,最后在末位加 1 。 接下来的问题是,如何能将减法运算转换成加法运算呢? 我们已经知道,原码表示简单直观,与真值转换容易。但如果用原码表示,其符号位不能参加运算。在计算机中用原码实现算术运算时,要取绝对值参加运算,符号位单独处理,这对乘除运算是很容易实现的,但对加减运算是非常不方便的,如两个异号数相加,实际是要做减法,而两个异号数相减,实际是要做加法。在做减法时,还要判断操作数绝对值的大小,这些都会使运算器的设计变得很复杂。而补码这种编码方式实际上正是针对上述问题的。通过用补码进行表示,就可以把减法运算化为加法运算。 在日常生活中,有许多化减为加的例子。例如,时钟是逢 12 进位, 12 点也可看作 0 点。当将时针从 10 点调整到 5 点时有以下两种方法: 一种方法是时针逆时针方向拨 5 格,相当于做减法: 10 - 5 = 5 另一种方法是时针顺时针方向拨 7 格,相当于做加法: 10 + 7 = 12 + 5 = 5 (MOD 12) 这是由于时钟以 12 为模,在这个前提下,当和超过 12 时,可将 12 舍去。于是,减 5 相当于加 7 。同理,减 4 可表示成加 8 ,减 3 可表示成加 9 ,…。 在数学中,用“同余”概念描述上述关系,即两整数 A 、 B 用同一个正整数 M ( M 称为模 ) 去除而余数相等,则称 A 、 B 对 M 同余,记作: A = B (MOD M ) 具有同余关系的两个数为互补关系,其中一个称为另一个的补码。 当 M = 12 时,- 5 和+ 7 ,- 4 和+ 8 ,- 3 和+ 9 就是同余的,它们互为补码。 从同余的概念和上述时钟的例子,不难得出结论:对于某一确定的模,用某数减去小于模的另一个数,总可以用加上“模减去该数绝对值的差”来代替。因此,在有模运算中,减法就可以化作加法来做。 可以看出,补码的加法运算所依据的基本关系为: 补 + 补 = 补 补码减法所依据的基本关系式: 补 = 补 = 补 + 补 至于加法运算为什么比减法运算易于实现以及 CPU 如何实现各种算术运算等问题,则需要通过对数字电路的学习来理解 CPU 的运算器的硬件实现问题的相关内容了。 转: http://blog.csdn.net/glgoober/article/details/6209540
个人分类: 编程|2661 次阅读|0 个评论
[转载]gcc、glibc和binutils模块之间的关系,以及在现有系统上如何
onewaystreet 2011-7-24 17:01
一、关于gcc、glibc和binutils模块之间的关系 1、gcc(gnu collect compiler)是一组编译工具的总称。它主要完成的工作任务是“预处理”和“编译”,以及提供了与编译器紧密相关的运行库的支持,如libgcc_s.so、libstdc++.so等。 2、binutils提供了一系列用来创建、管理和维护二进制目标文件的工具程序,如汇编(as)、连接(ld)、静态库归档(ar)、反汇编 (objdump)、elf结构分析工具(readelf)、无效调试信息和符号的工具(strip)等。通常,binutils与gcc是紧密相集成 的,没有binutils的话,gcc是不能正常工作的。 3、glibc是gnu发布的libc库,也即c运行库。glibc是linux系统中最底层的api(应用程序开发接口),几乎其它任何的运行库 都会倚赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现,主要的如下: (1)string,字符串处理 (2)signal,信号处理 (3)dlfcn,管理共享库的动态加载 (4)direct,文件目录操作 (5)elf,共享库的动态加载器,也即interpreter (6)iconv,不同字符集的编码转换 (7)inet,socket接口的实现 (8)intl,国际化,也即gettext的实现 (9)io (10)linuxthreads (11)locale,本地化 (12)login,虚拟终端设备的管理,及系统的安全访问 (13)malloc,动态内存的分配与管理 (14)nis (15)stdlib,其它基本功能 二、在现有系统上如何升级(redhat9上实践的) 1、升级这些库时,最好不要覆盖系统中缺省的;因为这些库,尤其是glibc库,是系统中最核心的共享库和工具,如果盲目覆盖,很可能导致整个系统 瘫痪,因为一般更新glibc库时,其它所有以来libc库的共享库都需要重新被编译一遍。因此,为了调试某个程序进入glibc时,最好把glibc安 装到/usr/local/lib下。 2、首先编译glibc库。注意最好令建立一个glibc-build的目录,configure时加上--enable-add-ons=linuxthreads选项。make install安装到/usr/local下。 3、修改gcc的spec文件(/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/specs),更改ld-linux.so.2为/usr/local/lib下的新的共享库装载器。 4、编译binutils库,此时被编译出的程序会连接到/usr/local/lib下的新的libc库。注意,在configure前,需要设 置ld缺省连接的路径(LIBRARY_PATH=/usr/local/lib:/lib:/usr/lib),否则binutils会 configure出错,找不到libc中的一些符号。具体步骤如下: (1)export LIBRARY_PATH=/usr/local/lib:/lib:/usr/lib (2)mkdir binutils-build cd binutils-build (3)../binutils-2.13.90.0.18/configure (4)make (5)make -C ld clean (6)make -C ld LIB_PATH=/usr/lib:/lib:/usr/local/bin(设置编译后的ld的缺省库搜索路径,后面的比前面的优先级高) (7)make install 三、总结 1、运行时,动态库的装载依赖于ld-linux.so.6的实现,它查找共享库的顺序如下: (1)ld-linux.so.6在可执行的目标文件中被指定,可用readelf命令查看 (2)ld-linux.so.6缺省在/usr/lib和lib中搜索;当glibc安装到/usr/local下时,它查找/usr/local/lib (3)LD_LIBRARY_PATH环境变量中所设定的路径 (4)/etc/ld.so.conf(或/usr/local/etc/ld.so.conf)中所指定的路径,由ldconfig生成二进制的ld.so.cache中 2、编译时,搜索库的路径顺序如下: (1)ld-linux.so.6由gcc的spec文件中所设定 (2)gcc --print-search-dirs所打印出的路径,主要是libgcc_s.so等库。可以通过GCC_EXEC_PREFIX来设定 (3)LIBRARY_PATH环境变量中所设定的路径,或编译的命令行中指定的-L/usr/local/lib (2)binutils中的ld所设定的缺省搜索路径顺序,编译binutils时指定。(可以通过“ld --verbose | grep SEARCH”来查看) 3、二进制程序的搜索路径顺序为PATH环境变量中所设定。一般/usr/local/bin高于/usr/bin 4、编译时的头文件的搜索路径顺序,与library的查找顺序类似。一般/usr/local/include高于/usr/include
个人分类: linux学习|1792 次阅读|0 个评论
VC 学习(1)每天进步一点点,人生就会达到一个新的高度
热度 1 songyanru243 2011-3-29 14:18
老板后天要检查我最近编制的程序。他要我实现读取数据文件,并显示,然后将其能够转换到二进制,十进制,八进制,十六进制,也就是不论读到的是什么数据,都能够做出转换并存储到另一个文件中。 我现在做出来的就是读取文件,到列表框,而且能够实现水平滚动条和垂直滚动条使得所有数据可现,也实现了单个数据的整个进制的转换。 现在的问题就是连贯起来,即怎样就可以完整的将整个读取到的数据一并转换到另一个列表框中,并将这个列表框中的数据在保存即写入另一个文件中。可以分成几个步骤,希望自己一步一步都能做下去,女人,要对自己狠一些,哈哈。还是很有道理的,没有高强度的训练和学习,没有持续的紧张和压力,没有充满激情的意志力。根本就没有继续下去的可能,所以,对自己要狠一些,再狠一些。 1、首先,可以先读取一个文件01.txt到listbox1,先不进行转换将其读取到listbox2,然后将listbox2的内容写入并存储到02.txt。这是一个必须经过的框架。 2、先不读取数据,只是将listbox1的内容比如有五个数据,一一读取,并进行转换,可以设置四个单选按钮,默认是十进制,在来一个转换的button,其ID为IDOK,和一个消息响应函数,在消息响应函数OnOK()中设置switch()函数,来做各个进制的转换。 具体细节,我再想想,先这么做一做,看看妥不妥,若有编程高手来此一游,能否提供点小建议。小女子,不甚感激。
个人分类: 科研交流|1025 次阅读|1 个评论
[转载](转)使用文本文件(.txt)进行数据存取的技巧总结
songyanru243 2011-3-17 09:04
特别说明:由于大家在 I/O 存取上以 txt 文件为主,且读取比存储更麻烦(存储的话 fwrite, fprintf 基本够用),因此下面的讨论主要集中在“txt 文件的读取”上。除了标注了“转”之外,其余心得均出于本人经验之 结果 ,欢迎大家指正、补充。 一. 基本知识: --------------------------------------------------转---------------------------------------------------- 1. 二进制文件与文本文件的区别: 将文件看作是由一个一个字节(byte) 组成的, 那么文本文件中的每个字节的最高位都是0,也就是说文本文件使用了一个字节中的七位来表示所有的信息,而二进制文件则是将字节中的所有位都用上了。这就是两者的区别;接着,第二个问题就是文件按照文本方式或者二进制方式打开,两者会有什么不同呢?其实不管是二进制文件也好,还是文本文件也好,都是一连串的0和1,但是打开方式不同,对于这些0和1的处理也就不同。如果按照文本方式打开,在打开的时候会进行translate,将每个字节转换成ASCII码,而以按照二进制方式打开的话,则不会进行任何的translate;最后就是文本文件和二进制文件在编辑的时候,使用的方式也是不同的。譬如,你在记事本中进行文本编辑的时候,你进行编辑的最小单位是字节(byte);而对二进制文件进行编辑的话,最小单位则是位(bit),当然我们都不会直接通过手工的方式对二进制文件进行编辑了。 从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种: ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。例如,数5678的存储形式为: ASCII码: 00110101 00110110 00110111 00111000 ↓  ↓      ↓   ↓ 十进制码: 5     6   7     8 共占用4个字节。ASCII码文件可在屏幕上按字符显示,例如源 程序 文件就是ASCII文件,用DOS 命令 TYPE可显示文件的内容。由于是按字符显示,因此能读懂文件内容。 二进制文件是按二进制的编码方式来存放文件的。例如,数5678的存储形式为:00010110 00101110 只占二个字节。二进制文件虽然也可在屏幕上显示,但其内容无法读懂。C 系统 在处理这些文件时,并不区 分类 型,都看成是字符流,按字节进行处理。 输入 输出 字符流的开始和结束只由程序控制而不受物理 符号 (如回车符)的控制。因此也把这种文件称作“流式文件”。 2. 文本模式(textmode)和二进制模式(binarymode)有什么区别? 流可以分为两种类型:文本流和二进制流。文本流是解释性的,最长可达255个字符,其中回车/换行将被转换为换行符“\n”,(如果以"文本"方式打开一个文件,那么在读字符的时候,系统会把所有的"\r\n"序列转成"\n",在写入时把"\n"转成"\r\n" )。二进制流是非解释性的,一次处理一个字符,并且不转换字符。 注: \n一般会操作系统被翻译成"行的结束",即LF(Line-Feed) \r会被翻译成"回车",即CR(Cariage-Return) 对于文本文件的新行,在UNIX上,一般用\n(LF)来表示,Mac上用\r(CR)来表示, Windows上是用\n\r(CR-LF)来表示。 通常,文本流用来读写标准的文本文件,或者将字符输出到屏幕或打印机,或者接受键盘的输入;而二进制流用来读写二进制文件(例如 图形 或字处理文档),或者读取鼠标输入,或者读写调制解调器。如果用文本方式打开二进制文件,会把“0D 0A”自动变换成“\n”来存在内存中。写入的时候反向处理。而二进制方式打开的话,就不会有这个过程。但是,Unicode/UTF/UCS 格式 的文件,必须用二进制方式打开和读写。 --------------------------------------------------------------------------------------------------------- 上述 基础 其实大可以略过, 简言之,对用户来说: 在 matlab 中存储成为二进制还是文本文件取决于fopen的方式,如果用wt,则存储为文本文件,这样用记事本打开就可以正常显示了;如果用w则存储为二进制文件,这样用记事本打开会出现小黑方块,要正常显示的话,可以用写字板或UltraEdit等工具打开。 二. Matlab的I/O文件操作使用技巧和总结: 1. Matlab 支持的I/O文件(对应“取/存”操作)类型: (所有文件I/O程序不需要特殊的 工具箱 ) http://www.mathworks.com/support/tech-notes/1100/1102.html (注:从上表可以看到,matlab不支持doc格式的文档存取(因为doc文档包含很多格式控制符),请改用txt或者dat格式) 2. Matlab 的I/O文件指南: http://www.mathworks.com/support/tech-notes/1600/1602.html 以下是部分对应的中文译文: --------------------------------------------------------------转---------------------------------------- 本技术支持指南主要处理:ASCII, binary, and MAT files. 要得到 MATLAB 中可用来读写各种文件格式的完全 函数 列表,可以键入以下命令: help iofun MATLAB中有两种文件I/O程序:high level and low level. High level routines: 包括现成的函数,可以用来读写特殊格式的数据,并且只需要少量的 编程 。 Low level routines: 可以更加灵活的完成相对特殊的任务,需要较多的额外编程。 High level routines 包括现成的函数,可以用来读写特殊格式的数据,并且只需要少量的编程。 举个例子,如果你有一个包含数值和字母的文本文件(text file)想导入MATLAB,你可以 调用 一些low level routines自己写一个函数,或者是简单的用 TEXTREAD 函数。 使用high level routines的关键是:文件必须是相似的(homogeneous), 换句话说,文件必须有一致的格式。下面的段落描述一些high level file I/O routines并给出一些例子帮助理解概念。 LOAD/SAVE 主要的high level file I/O routines 是 LOAD 和 SAVE 函数。LOAD 可以读MAT-file data或者用空格间隔的格式相似的ASCII data. SAVE可以将MATLAB 变量 写入MAT-file格式或者空格间隔的ASCII data。大多数情况下,语法相当简单。下面的例子用到数值由空格间隔的ASCII file sample_file.txt : 1 5 4 16 8 5 43 2 6 8 6 8 4 32 1 90 7 8 7 6 5 9 81 2 3 Example: 用 LOAD and SAVE 读写数据 CODE: % Load the file to the matrix, M : M = load('sample_file.txt') % Add 5 to M : M = M +5 % Save M to a .mat file called 'sample_file_plus5.mat': save sample_file_plus5 M % Save M to an ASCII .txt file called 'sample_file_plus5.txt' : save sample_file_plus5.txt M -ascii UIGETFILE/UIPUTFILE UIGETFILE / UIPUTFILE 是基于图形用户 界面 ( GUI )的。会弹出对话框,列出当前目录的文件和目录,提示你选择一个文件。 UIGETFILE 让你选择一个文件来写(类似Windows ‘另存为’选项?)。用 UIGETFILE ,可以选择已存在的文件改写,也可以输入新的文件名。两个函数的返回值是所选文件名和路径。 Example: 用 UIGETFILE 从当前目录选择一个 M-file CODE: % This command lists all the M-files in the current directory and % returns the name and path of the selected file = uigetfile('*.m','Sample Dialog Box') 注意: UIGETFILE 一次只能选择一个文件。 UIIMPORT/IMPORTDATA UIIMPORT 是一个功能强大,易于使用的基于GUI的high level routine,用于读complex data files。文件也必须是homogeneous。 IMPORTDATA 形成 UIIMPORT 的功能,不打开GUI。可以将IMPORTDATA用于函数或者脚本中,因为在函数或者脚本中基于GUI的文件导入机制并不理想。下面的例子用到包含几行文件头和文本、数值数据的文件 'sample_file2.txt' : This is a file header. This is file is an example. col1 col2 col3 col4 A 1 4 612.000 B 1 4 613.000 C 1 4 614.000 D 1 4 615.000 Example: Using IMPORTDATA to read in a file with headers, text, and numeric data CODE: % This reads in the file 'sample_file2.txt' and creates a % structure D that contains both data and text data. % Note the IMPORTDATA command specifies a white space % as the delimiter of the file, but IMPORTDATA can usually % detect this on its own D = importdata('sample_file2.txt','')% 原文有误? D = importdata('sample_file2.txt') 可以通过访问结构D的数据和文本域,来看结构D中的真实值,例如输入: data = D.data text = D.textdata 可以用UIIMPORT读同一个文件并得到同样的结构. 注意: 对于 ASCII data, 你必须检验导入向导正确的识别了列分隔符。 TEXTREAD/STRREAD TEXTREAD 是一个强大的动态high level routine, 设计 用来读ASCII格式的文本和/或数值数据文件。 STRREAD 除是从字符串而不是文件读以外,类似于 TEXTREAD 。 两个函数可以用许多 参数 来改变其具体的工作方式,他们返回读入指定输出的数据。他们有效的提供给你一个 “两全其美”的方法,因为他们可以用一个命令读入混合的ASCII和数值数据(high level routines的做法),并且你可以改变他们以匹配你特定的 应用 (如同low level routines做到的)。例子: CODE: Example 1: Using TEXTREAD to read in an entire file into a cell array % This command reads in the file fft .m into the cell array, file file = textread('fft.m','%s','delimiter','\n','whitespace',''); CODE: Example 2: Using STRREAD to read the words in a line % This command uses the cell array created in Example 1 to % read in each word of line 28 in 'file' to a cell array, words words = strread(file{28},'%s','delimiter','') CODE: Example 3: Using TEXTREAD to read in text and numeric data from a file with headers % This command skips the 2 header lines at the top of the file % and reads in each column to the 4 specified outputs = textread('sample_file2.txt','%s %s %s %s','headerlines',2) CODE: Example 4: Using TEXTREAD to read in specific rows of text and numeric data from a file % This command reads in rows B and C of the file. The 'headerlines' % property is used to move down to the desired starting row and the % read operation is performed 2 times = textread('sample_file2.txt',... '%s %s %s %s',2,'headerlines',4) CODE: Example 5: Using TEXTREAD to read in only the numeric data from a file containing text and numbers % This command reads in only the numeric data in the file. The % 'headerlines' property is used to move down to the first row % of interest and the first column of text is ignored with the % '*'operator = textread('sample_file2.txt','%*s %d %d %f','headerlines',3) DLMREAD/DLMWRITE/CSVREAD DLMREAD 和 DLMWRITE 函数能够读写分隔的ASCII data,而不是用low level routines。他们比low level routines容易使用,Low level routines用几行 代码 实现的功能可以用DLMREAD/DLMWRITE简化成一行。 CSVREAD 用来读分隔符是逗号的文件,是 DLMREAD 的特殊情况。当读空格和Tab分隔的电子数据表文件时, DLMREAD 特别有用。以 'sample_file.txt' 为例: CODE: Example 1: Using DLMREAD to read in a file with headers, text, and numeric data % This reads in the file 'sample_file2.txt' and creates a matrix, D, % with the numeric data this command specifies a white space as the % delimiter of the file D = dlmread('sample_file.txt','') CODE: Example 2: Using DLMREAD to extract the first 3 columns of the last 3 rows % This reads in the first 3 columns of the last 3 rows of % the data file 'sample_file.txt'into the matrix, D_partial. % 读文件 'sample_file.txt' 前3列后3行,到 矩阵 D_partial. D_partial = dlmread('sample_file.txt','', ) CODE: Example 3: Using DLMWRITE to write a comma delimited file % This creates a file called 'partialD.txt' that consists of % the first 3 columns of the last 3 rows of data where each % element is separated by a comma dlmwrite('partialD.txt',D_partial,',') 注意: 保证DLMREAD and DLMWRITE指定范围的指标从0开始,而不是从1开始。 WK1READ/WK1WRITE WK1READ 用来读Lotus123 电子数据表文件的数据; WK1WRITE 用来写矩阵到Lotus123 电子数据表文件。 XLSREAD XLSREAD 用来读 Excel 的数值和文本数据。 --------------------------------------------------------------------------------------------------------- 三. 具体例子分析: Matlab网站用两个例子非常详尽地介绍了各个命令的基本用法,实际中,面对手头上的数据,如何选用合适的命令呢?以下结合几个示例给出一些总结,大家举一反三就可以了: 1. 纯数据(列数相同): 源文件: CODE: 0 3866.162 2198.938 141.140 1 3741.139 2208.475 141.252 2 3866.200 2198.936 141.156 3 3678.048 2199.191 141.230 4 3685.453 2213.726 141.261 5 3728.769 2212.433 141.277 6 3738.785 2214.381 141.256 7 3728.759 2214.261 141.228 8 3748.886 2214.299 141.243 9 3748.935 2212.417 141.253 10 3733.612 2226.653 141.236 11 3733.583 2229.248 141.223 12 3729.229 2229.118 141.186 解答 :对于这个txt文件,由于各行列数相同,故简单地使用load,importdata均可。 2.字段名(中、英文字段均可)+数据: 源文件: CODE: CH0 CH1 CH2 CH3 0.000123 0.000325 0.000378 0.000598 0.000986 0.000256 0.000245 0.000698 解答 :由于是记录的形式,因此各行列数必相同(缺少部分列时请自行在文件中补上 Inf 或 NaN),故直接使用 importdata 便可。 3.注释(含有独立的 数字 串)+数据(列数相同): 问题 :这个文件有4列,但前6行是文字说明,4列数字是从第8行开始的.现在我想把这个文件的前2列和文字说明提出来组成一个新的dat文件 源文件: CODE: Group 212.02.2006 Limei Samples of datas: 50000 CH0CH1CH2CH3 0.0001230.000325 0.000378 0.000598 0.0009860.000256 0.000245 0.000698 目标文件: CODE: Group 2 12.02.2006 Limei Samples of datas: 50000 CH0 CH1 0.000123 0.000325 0.000986 0.000256 解答 :由于注释中含有独立的数字串,且注释部分没有明显的格式,这时候用importdata, load等高级命令直接读取会失败,用 textread, dlmwrite 等格式化命令也不太合适,因此只能使用低级命令进行读取。(当然了,可以跳过注释部分直接用高级命令读取数据,即: = textread(filename,'%f %f %f %f','headerlines',4); )。一个简单的、非通用的包含注释的读取方法如下: -------------------------------------转 --------------------------------------------------------------------------------------- CODE: clc;clear; fid = fopen('exp.txt', 'r'); fid_n=fopen('ex.dat','w'); while ~feof(fid) tline=fgetl(fid); if ~isempty(tline) if double(tline(1))=48 double(tline(1))=57%数值开始 a=strread(tline); a(3:4)= =strread(tline,'%s %s %s %s'); b= ; fprintf(fid_n,'%s\n',b); clear b b1 b2 b3 b4; else fprintf(fid_n,'%s\n',tline); end else fprintf(fid_n,'%s\n',tline); end end fclose(fid); fclose(fid_n); --------------------------------------------------------------------------------- 4. 注释(不含独立的数字串)+数据(列数相同): 源文件: CODE: 你好 abc 欢迎来到 我们 振动论坛 vib.hit.edu.cn 1 11 111 1111 2 22 222 2222 3 33 333 3333 4 44 444 4444 5 55 555 5555 解答: 直接用 importdata 便可 注: 有时候注释中含有独立的数字串也可以 importdata 成功,不过得到的结果有可能不正确,建议这时候使用第3种情形的读取方式。 5. 注释与数据混排: 对此当然只能自己编程,举例: 源文件 : CODE: 1 11 111 1111 你好 2 22 222 2222 欢迎来到 3 33 333 3333 振动论坛 4 44 444 4444 vib.hit.edu.cn 5 55 555 5555 解答: --------------------------------------------转-------------------------------------- CODE: function =distilldata(infile) %功能说明: %将 保存 数据的原始文件中的数值数据读入到一个data变量中 %使用说明: % infile——原始数据文件名; % data=数据变量 tmpfile='tmp2.mat'; fidin=fopen(infile,'r'); % 打开原始数据文件(.list) fidtmp=fopen(tmpfile,'w'); % 创建保存数据文件(不含说明文字) while ~feof(fidin) % 判断是否为文件末尾 tline=fgetl(fidin); % 从文件读入一行文本(不含回车键) if ~isempty(tline) % 判断是否空行 =size(tline); flag=1; for i=1:n %判断一行中有没有字符(+-.Ee和空格键除外) if ~(tline(i)==' '|tline(i)=='-'|tline(i)=='.'|tline(i)=='E'... |tline(i)=='e'|tline(i)=='+'... |(double(tline(i))=48double(tline(i))=57)) flag=0; break; end end if flag==1 % 如果是数字行,把此行数据写入文件 fprintf(fidtmp,'%s\n',tline); end end end fclose(fidin); fclose(fidtmp); data=textread(tmpfile); delete(tmpfile); --------------------------------------------------------------------------------------------------------- 另外,如果要求不高,也可以使用 textread 函数跳过注释部分进行读取,不过前提是需要事先知道文件内容的结构(即哪行是数据、哪行是注释) 6.各列数据的分离: 源文件: CODE: 0 +47038.7 1.0509:26:07C 2 +46477.7 1.0309:28:38C 4 +44865.7 1.0409:28:48C 6 +41786.4 1.0309:28:56C 8 +39896.0 0.9709:29:03C 10 +37518.4 0.9309:29:15C 12 +35858.5 0.9209:29:30C 14 +46105.0 1.0309:30:21C 16 +46168.6 6.8909:30:30C 18 +48672.3 4.3309:30:40C 20 +49565.7 0.4909:30:48C 22 +49580.7 0.5309:30:55C 24 +49602.3 0.8409:31:03C 26 +49582.5 1.5109:31:11C 28 +49577.0 1.3909:31:19C 30 +49589.3 0.6109:31:27C 32 +49578.3 1.0609:31:29C 34 +49512.5 1.7709:31:38C 解答: 直接用 =textread(yourfilename,'%d %c %f %f %s %c'); 便可 四. 注意事项: 1. 请在 matlab 中保持当前路径在该数据文件对应的目录下进行存取,否则,存取时请给出该数据文件的具体路径。 2. 存取时,请给出该数据文件的全称(包括后缀名,读取mat文件时可省略) 3. load data.txt和A=load(‘data.txt’)的区别请参阅精华贴: 写给学习 matlab 的 新手 们 4. 请根据读写需要来打开文件,即根据你的需要来指定 fopen 的 permission 属性为读或写。如果只用 a 进行写入,就不能用 fread 读取。此时应该写完关闭文件,然后用 r 打开读取,或者直接用 a+ 进行同时读写操作。否则,会产生莫名其妙的问题!以下代码是一个 错误 的例子: CODE: filename='e.dat'; fid=fopen(filename,'a'); if fid0 error('fopen error'); end s= ; fwrite(fid,s,'float32') =fread(fid,inf,'float32');%把t中的数据全部读出,即s矩阵。 fclose(fid); 此时得到的dd, ll 是错误且无意义的! 五. 其他相关问题: 1. 连续读取多个文件的数据,并存放在一个矩阵中: (1) 首先是如何读取文件名: 方法一: filename=dir(‘*.jpg’); 那么第i个文件的文件名就可以表示为 filename(i).name 文件数量为:length(filename) 方法二: 先在Windows的 MSDOS(命令行)中使用以下命令生成一个list.txt文件: dir path\folder /on /b /s path\list.txt 举例:dir d:\test /on /b /s d:\list.txt 然后在 matlab 中使用: filename = textread(sFileFullName,'%s'); 把所有文件名读取到list细胞矩阵中,最后对filename{i}便可得到各文件名。 (2) 然后是读取文件名的数据并存储: 假设每个文件对应的数据是m*n的,则: CODE: k = length(filename); Data = zeros(m,n,k); for ii = 1:k Data(:,:,ii) = yourreadstyle(filename{ii}); %yourreadstyle是对应的文件读取方式的函数 end 2. 连续读取多个文件的数据,并存放在多个矩阵(以文件名命名)中: 假设每个文件对应的数据是m*n的,则以上述第二种文件名读取方法为例: CODE: k = length(filename); for ii = 1:k D = yourreadstyle(filename{ii}); eval( ); end 3. 文件名命名问题: 文件名为 abc00001,abc00002,... abc00009,abc00010,... abc00099,abc00100,...abc00879.准备把这些文件名给放到一个 数组 里面去。 解答: CODE: a=cell(879,1); for k=1:879 a{k} = sprintf('%.5d',k); end 4. 上述各种文件格式、类型自动识别问题 :可以利用正则表达式来处理,使之通用性较强。例如使用以下代码可以自动处理上面提到了例1到例5各种情形,不过由于存在自动判断,对某些例子(如例1)效率自然要低一点,而对于另外的例子(如例3、例5)效率估计要高一点(少用了一个循环)。 CODE: function =distilldata_eight(infile) %功能说明: %将保存数据的原始文件中的数值数据读入到一个data变量中(自动判断数据行) %使用说明: % infile——原始数据文件名; % data=数据变量 tmpfile='tmp2.mat'; fidin=fopen(infile,'r'); % 打开原始数据文件(.list) fidtmp=fopen(tmpfile,'w'); % 创建保存数据文件(不含说明文字) while ~feof(fidin) % 判断是否为文件末尾 tline=fgetl(fidin); % 从文件读入一行文本(不含回车键) if ~isempty(tline) % 判断是否空行 str = ' '; %正则表达式为:该行中是否包含除 - . E e 数字 和 空白字符 外的其他字符 start = regexp(tline,str, 'once'); if isempty(start) fprintf(fidtmp,'%s\n',tline); end end end fclose(fidin); fclose(fidtmp); data=textread(tmpfile); delete(tmpfile) 5. 大量数据的读取问题: 可以考虑使用循环分批读取(特别是在各数据是独立的时候),或者使用稀疏矩阵来实现(对此可以参阅本版精华贴: 提高matlab 运行 速度和节省空间的一点心得(之三) )。另外,也可参考《深入浅出MATLAB 7_X 混合编程 》一书第一章 6. 读取整个txt文件的内容(获得文件中的所有字符): CODE: f = fopen('yourfilename.txt','rt'); % t 属性根据需要可省略 x = fread(f,'*char'); fclose(f); 7. 把维数不同的矩阵及其变量名保存到一个 txt 文件中,例如 a1 = 123; a2 = ,希望得到的 txt 文件如下: QUOTE: a1: 123 a2: 1 2 3 4 5 6 如果写入的时候简单一点,则可以采用以下方式,不过读取的时候比较麻烦: CODE: a1=123; a2= ; fid = fopen('myfile.txt', 'wt'); for i=1:2 fprintf(fid, '%s: \n %s\n', , mat2str(eval( ))); end fclose(fid); 相反,如果写入的时候复杂一点,则读取的时候会简单一点: CODE: a1=123; a2= ; fid = fopen('myfile.txt', 'wt'); for i=1:2 fprintf(fid, '%s: \n', ); b = eval( ); fprintf(fid, , b'); end fclose(fid);
个人分类: 科研交流|950 次阅读|0 个评论
[转载]mapx中对于空间数据与属性数据的处理
lizhouping 2011-1-21 09:50
第一部分罗里罗嗦 GIS空间数据(包含属性数据)存储的方式主要有三种: 1、地图文件+属性关系数据库表的混和方式,目前主流方式,如MapInfo一个图层,*.map文件存储空间地图数据,*.tab以关系数据库表的形式存储属性数据。 2、关系数据库表中有一个特殊字段存储二进制的空间对象数据。这个我把它称为半关系型空间数据库。比如geomedia 3、全关系型空间数据库。空间对象的坐标位置信息以一定的机制(不是单个二进制大对象)全部存入关系数据库。如Esri的Geodatabase MapX的开发者肯定有很多是熟悉MapInfo的。在MapInfo里面打开一个地图,同时就可以打开一个浏览表浏览空间对象的属性。这是因为图层与数据库表进行了预先绑定。但是如果开发者用MapX打开一个个图层之后,他可能会发现这些图层的属性不知道去哪里去找了。这是因为MapX没有再为我们预先绑定空间数据和属性数据库了。在mapx下,一个图层的空间数据和属性数据分别用layer对象和dataset对象完全分开管理。这样的好处就在于为扩大了属性数据的来源。你可以为一个layer的空间对象绑定多个数据库表。而且用主流关系型数据库软件来管理属性数据可比一个单纯的*.tab好多啦!(其实mapinfo也为我们提供了许多绑定和操作外部数据库的工具,我们不常用而已) 那如何在mapx里用语句绑定外部的数据库呢?跟我来 首先我还得罗嗦两句MapX这个控件。MapX控件提供了几十个对象,这些对象又通过其属性方法实现了MapInfo大部分的GIS功能。在MapX提供的对象里面有几个我们要特别关注,因为我们要经常用到它们:Layer对象、Layers集合。用于管理图层。 Dataset对象、datasets集合。用于管理属性数据集,可以看作一个数据库的记录集。不过dataset必须绑定于某一个layer对象上。 Annotation对象、Annotations集合,管理注记。 Feature对象,Features集合。用于管理空间对象。Feature可以是某一layer上的对象,也可以是不属于某一层的独立的(stand-alone)对象。 FeatureFactory对象。用于对feature进行一些空间操作。比如buffer、创建对象、求对象相交等 第二部分言归正传 言归正传,讲MapX里绑定数据库表的方法。 其实说到底只需要一个方法就可以了——Map.Datasets.Add 我以一个实例来讲解这个方法的用法。 假设MapX已经打开一个图层,图层名为"a",手头还有一个Access数据库a.mdb,数据库里面有个表X想和a图层绑定。我们保证a层属性里面有一个字段ID1与表X的一个字段ID2是匹配的!! 。 第一步,数据库的连接 各式各样的数据库要连进VB、VC,就需要二传手——DAO、ADO、RDO等等我们在VB里面用ADODC这个控件在设计时就可以把a.mdb连接进来,把表X作为一个recordset。当然也可以用语句conn="Provider=Microsoft.Jet.OLEDB.4.0;DataSource=a.mdb;PersistSecurityIn fo=False" WithAdodc1 .ConnectionString=conn .RecordSource="Select*FromX" .Refresh EndWith 其它关系数据库(Oracal、SQLServer)的表也完全可以通过ADODC连接进来。只是连接字 符串里面的Provider不同罢了。 第二步,layer与数据库的绑定 Datasets.add方法 第一个参数Type。他可以绑定多达13种的数据源,比如ADO、DAO、ODBC等等。这里我们当然用miDataSetADO 第二个参数SourceData。指定数据源。我们的数据源是表X。我们已经指定表X是Adodc1的当前记录源。该参数即为adodc1.recordset 第三个参数Name。指定被绑定后的dataset的名称。可选第四个参数GeoField。指定数据源中某个字段作为与layer匹配的字段。如果不选,MapX会自动帮你找一个的。这里我们是ID2 第五个参数SecondaryGeofield。指定数据源第二匹配字段。如果指定的第一匹配字段中两个值相等,就靠它来找到对应的对象了。一般不用 第六个参数BindLayer。指定绑定到哪一层。可以用层名,也可以用Layer对象。我们例子里面图层是a,将其作为参数。如果不指定,MapX也会自动帮你找一个的。(呵呵蛮智能的吧) 第七个参数Fields。指定数据源中哪些字段参与绑定。 第八个参数Dynamic。指定是否是动态绑定。缺省为false。动态绑定就是要用这个dataset时MapX再临时绑定数据到对象上 讲解完了参数的用法,我们的语句也就出来了: dimMyDatasetasDataset setMyDataset=Map1.Datasets.Add(miDataSetADO,Adodc1.recordset,"MyDataset"," ID2",,"a") 这一句里面,"ID2"和"a"如果不写也不会影响结果,因为MapX会自动去寻找最符合要求的字段和被绑定图层的。但是作为一种良好的编程风格,最好指定! 第三步,尽情的用你的dataset吧 绑定了dataset,一个图层才具有了属性的数据。你才可以进行很多功能的实现。比如说取值赋值、专题制图等等 第三部分你问我答 问:dataset不是绑定到具体layer上吗?怎么不可以用Layer.datasets.add方法实现? 答:这是MapX的规定。它把被绑定layer作为参数,而不是作为绑定的出发点。实际上,Layer.Datasets其实只是一个只读的集合,只能读取绑定到该层上的若干个dataset 问:我如果想绑定table文件自带的属性怎么做? 答:最easy了。setMydataset=datasets.add(miDataSetLayer,某个layer对象)OK,后面的参数都不需要!! 问:我绑了半天,还是出现这样的错误——InValidGeoFieldspecified.Namenotfound,orindexoutofrange.我快发疯了,为什么啊?? 答:先别发疯。检查一下几点: 你确定你的layer图层有一个字段和数据源的某一个字段肯定匹配?? 图层中该字段是否是索引字段???这一点很重要!!检查方法,用mapinfo打开table, 查看其表结构,如果该字段“索引”(indexed)没有打上勾,please勾上!
3849 次阅读|0 个评论
计算机学习漫谈(8)——计算机眼中的数字世界
Jacking 2010-12-10 21:57
     从古至今,人类发明了很多数字的表示方法,比如罗马数字,中国数字,还有我们现在最熟悉的阿拉伯数字。而在计算机世界中,同样存在一种数字表达方法,而且这种方法和我们通常所熟悉的方法还存在比较大的差别。不管是罗马数字还是阿拉伯数字,我们使用的都是十进制。人类使用十进制来表达数字估计是和人类的生理结构有较大关系,因为不管是手指头还是脚趾头,我们都有10个。假如人拥有8个手指头或者16个手指头,估计我们现在使用的就不是十进制,而是八进制或者十六进制了。不过这只是猜测而已,好像没有科学证明。      (1)二进制   在我们所熟悉的十进制中,我们规定逢十进一。比如在幼儿园的小朋友学习数数时,从1数到10时他们会将他们人类天生的计数器手指派上用场,而到了11时他们就不知道怎么办了?这时候老师就要教他们在纸上写上10,然后继续往下数。而在计算机里,它是没哟手指的,那它应该怎么去学习数数呢?人类已经帮他们制定好一整套方法了。首先,计算机虽然没有手指,但它们有电压。在任何电路中,都会存在两种状态,一个是通路,一个是断路,也可以表示成两点之间存在电压和没有电压两种状态。我们现在把有电压的状态用1表示,把没有电压的转台用0表示。于是,我们就可以建成一套有一连串1和0表示的数字体系了,这种方法就是做二进制数字表达法。   一个二进制数是有一连串1和0组成的,比如00001表示的是十进制中的1,而00010表示的是十进制中的2。这里这个要么是1要么是0的符号单位称为一个bit,也就是比特或位。一个二进制用k个bit来表示称为这个二进制有k-bit宽度。在二进制中,我们规定逢二进一,就像我们十进制中逢十进一一样。这样,我们可以算出1个bit能表示2个数字,2个bit表示4个数字,3个bit表示8个数字,也就是K个bit表示2^k个数字。同时,我们还规定8个bit为一个字节,32位能同时表示4个字节。我们现在所用到的电脑大多数都是32位,也就是每个数用32bit表示。不过我们下面用到的例子多是8bit或16bit,这样就不用写那么长的一串1和0了。   现在我们已经为计算机制定好用于表示数字的二进制,不过这对于计算机来说还远远不够,因为数据是有分类型的,如整数,小数,正数、负数等,我们还要给计算机规定好这些,它才能比较方便地进行计算。现在我们一起来看看几种常见的数据类型。      (2)整数数据类型   如果我们不考虑整数前面的符号,那么表达就容易多了。直接用二进制的方法表达即可。K个bit表示2^k个数字,8个bit可以表达2^8=256数字。然而在实际计算中,我们会用到大量的负数,这些负数如何表达呢?我们可以将2^k一分为二,一半表示正数,一半表示负数。但如何表示呢,我们伟大的辈们已经想好怎么去表达了。   第一种方法叫作符号位法。这种方法是在数字前面留出一位来表示符号,1代表负数,0代表正数。于是,8bit中第一位表示符号,后7为表示数字,所以它能表示-128~+127。   第二种方法叫做反码表示法。其方法是:将一个正数所有bit全部取反,即得到该正数所对应的负数编码,例如+5表示为00101,那么-5则为11010。   不过这两种方法只是在早期计算机中应用,因为他们在硬件逻辑设计上都相当复杂。所以,我们需要设计更适合硬件操作的编码方案,这种方法叫做补码表示法。      (2)补码   在自然数中,绝对值相同但符号相反的两个数之和为零。补码就是按照这个条件要求来编制的。在补码表示中,如果已知一个非零整数A的编码,其相对应的负数的编码是取反加1,即把A的编码全部取反,然后再加上1。例如,如果数字1的编码为00001,则-1的编码是11110+1=11111。我们可以看到00001+11111=00000,正数与负数相加正好等于0.        (3)数制转换   我们人类所熟悉的十进制与计算机所用的二进制之间是如何转换呢?这里有一道公式,只要记住它,我们就可以很快地进行数制转换了。我们先来背背这个公式:除2取余,逆序排列。什么意思呢?我们做道例题就知道了。 例1: 将89转为二进制 解: 89/2=441, 44/2=220, 22/2=110, 11/2= 51, 5/2= 21, 2/2= 10, 1/2= 01 答:89转换为二进制为1011001 例2:将50转为二进制 解: 50/2=250 25/2=121 12/2= 60 6/2= 30 3/2= 11 1/2= 01 答:50的二进制位110010 二进制如何转为十进制呢? 我们在十进制里有一个计数方法叫科学计数法。比如1000=1*10^3,200003=3+2*10^5 在二进制里我们同样可以用这种科学计数法,因为它是科学的,所以是通用的。 用上面的例子试试看: 例3:将110010转为十进制 解:110010=1*2^5+1*2^4+1*2^1=32+16+2=50 答:110010的十进制是50。 例4:将110010转为十进制 解:1011001=1*2^6+1*2^4+1*2^3+1=64+16+8+1=89 答:110010的十进制是50。       通过上面的例题,我们可以很轻松的掌握十进制与二进制之间相互转换了。      (4)算述运算   二进制加法:在十进制里的加法,是每逢满十就前进一位,那以此类推,在二进制里的加法,就是每逢满二就前进一位。下面我们做道例题。 例5:1+1=?; 解: 1 + 1 =10 答:1+1=10 例6:3+3=? 解: 11 + 11 =110 答:3+3=11+11=110 二进制减法:在二进制的减法中,只要先把减数通过补码方法转换成负数,然后两者相加即可。 符号扩展 在一些情况下,为了减少占用空间,较小的数值会采用较少的bit来表示或存放。例如,数值5如果按照16bit表示的话就是0000000000000101,可我们用6bit来表示就足够的,000101。这两种方式表达的内容都一样,但占用的空间就有较大差别了。但是,如果遇到一个6bit和一个16bit的数相加或相减,就会出问题了。例如13和-5相加, 例6 0000000000000101 + 111011 =0000000001000000 这样就变成了13+(-5)=64,这明显是错误的。所以,我们要把宽度较小的数字进行符号扩展,使得两个操作数的宽度相同。 符号扩展的方法是正数前面添加0,在负数前面添加1。因为在二进制中,正数前提任意添加0是不会改变其值的,而在负数前任意加1也是不会改变它的数值的。 溢出 我们知道计算机表达数字是有一定的位数的,如我们所说的8bit,16bit,这也就说明计算机中能够表达的数目是有限的,如果让两个数进行相加,完全有可能得到的结果超出了计算机所能表达的范围,于是出现了计算错误,这就是溢出。 例如,在5-bit码字的表达范围ieshi-16~+15。如果计算(+9)+(+11)的运输结果, 例7 01001 +01011 =10100 结果得到的是一个负数,这就是溢出错误。 而两个负数相加,也有可能出现溢出错误,例如表达式(-12)+(-6), 例8 10100 +11010 =01110 两个负数相加变成了正数,这显然是错误的。 上面的例子都是发生在相同符号数相加的情况下,而事实上,溢出错误是只可能出现在相同符号数相加的情况下。   (5)逻辑运算   数学运算出了算术运算之外,还存在逻辑运算。我们来看看二进制中的逻辑运算是怎么样的。    与运算    与运算(AND)的运算规则为两个操作数为1时结果为1,否则为0。    A B AND    0 0 0    0 1 0    1 0 0    1 1 1          或运算    或运算(OR)的运算规则为两个操作数中任意一个为1时结果为1,否则为0    A B OR   0 0 0   0 1 1   1 0 1    1 1 1       非运算    非运算(NOT)为一元逻辑运算,对操作数直接取反。     A NOT    0 1     1 0      异或运算(Exclusive-OR)    异或运算为两元逻辑运算,如果两个操作数不同时结果为1,相同时结果为0     A B OR    0 0 0   0 1 1    1 0 1   1 1 0       (6)浮点数   用二进制表示数字时会有一个范围,即使是16bit的,也只能表示-2^15~+2^15-1。如果我们需要表示一个很大的数,如摩尔常数(6.023*10^23),用之前的方法就无法表达出来了。所以我们定义了另一种数据类型,叫做浮点数。   浮点数就想到与我们常用的科学计算法,如6.023*10^23就采用科学计数法。在这种方法中,有三个组成部分,第一是符号,第二是尾数,第三是指数。在6.023*10^23中,符号是+,尾数是6.023,指数是23。在浮点数中同样也规定了这三个部分。IEEE标准中规定,浮点数由32bit组成,其中,第一位表示符号,中间八位表示指数,最后23位表示尾数。在二进制方式下,第一个非零数字只可能是1,所以这个1可以省略。   我们举个例子,现在有一个数00111101100000000000000000000000, 第一个0表示这个数位正数,中间八位表示这个数的指数为-4,后面23为表示尾数为1.00000000000000000000000,所以,这个二进制数表示的是+1.00000000000000000000000*2^(-4)=1/16。   我们不必对浮点数做过于深入的研究,我们只要知道浮点数可以表达很大的数就可以了。        (7)ASCII码   (American Standard Code for Information Interchange,美国信息互换标准代码)在计算机中,所以数据都是用二进制来表示的。比如0代表0,1代表1,10代表2,以此类推。但这并不是唯一固定的,而是认为把他们匹配的。如果每个人都用自己的一套表达方式,那么计算机就不知道听谁的了。所以,大家就统一制定一个标准,这个标准就是ASCII编码 ASCII编码规定:0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符);32~126(共95个)是字符(32sp是空格),其中48~57为0到9十个阿拉伯数字; 65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。   (8)十六进制计数法   假设有一个16bit的二进制数:0011110101101110,如果让你在两秒中记住这个数,你能做到吗?   估计很少人能够做到。不过,如果我们换一种写法,也许你就会觉得这是轻而易举的事情了。   我们把16bit的数据分成四段,每段4bit。4bit可以表示16个数字,我们分别用0123456789ABCDEF这16个字符来代替。于是,0011=3,1101=13=D,0110=6,1110=14=E,也就是说0011110101101110可以表示成3D6E。这样子我们就很容易就能记住这个数字了。   上面提到的这种方法叫做十六进制计数法,它的主要好处就是方便人们记忆和使用。      通过上文的描述,我们已经在计算机眼中的数字世界逛了一圈,希望大家都有点收获!    
个人分类: 计算机漫谈|6081 次阅读|2 个评论
难得的一个好题目——“N进法”
liwei999 2010-10-27 18:01
难得的一个好题目N进法。 (1525 bytes) Posted by: mirror Date: October 27, 2010 01:04AM 这是红墙上北斗的话题,为了保证原创性,必须要给出这个链接( )。 引用: 北斗说: 时间计量的60分等于一小时,60秒等于一分不是60进制,还是10进制。 所谓几进制,是有几个表示符号,二进制是2个符号,0和1;3进制有3个符号,0,1,2;10进制有10个符号。 一分钟等于60秒,一盒鸡蛋有十二个,一辆汽车有四个轮子,一个连有三个排,这些都和进制无关,叫做unit designation,还是十进制,因为它们就用了十个符号。 你要是死要面子继续狡辩,我们真是没的谈了。就这么一个三分钟问题,一帮人扯了十多年还不肯认错。 这位北斗兄的著名论断就是200秒等于3分。这个精神镜某也很是满意。 60秒等于一分不是60进制,还是10进制 的说法相当地好。这也是个常识中的盲点。的确,如果是六十进位,就必需有60个符号。 今天的计(记)数方法的正式名称是什么?北斗老兄没有给出来,大约知道的人也不多。应该是叫做 阿拉伯数字十进占位记数法 。这个占位的说法很要紧,也就是说要用零来补空位。没有补空位智慧的时代里如何记数的呢?用的办法是十、百、千、万这样的单位。这类方法叫做命数法,有别于记数法。 回到60秒等于一分不是60进制,还是10进制的说法上来看,便可知道,记数是十进位(制)的。理由就是只有从0到9十种符号。但是单位是60进制的,即每到60换一个单位。就如同每到10换一个单位十,每到100换一个单位百。这叫作单位进制。更明显的单位进制是万万为亿。 按北斗的说法,这个事情争了十多年了。今天,镜某给个一锤定音。 这样日常的事情人们尚不能很好地领悟,中医好坏云云的事情也就不必去考虑了。这里面有个能力的问题。 就是论事儿,就事儿论是,就事儿论事儿。 http://www.starlakeporch.net/bbs/read.php?1,70602
个人分类: 镜子大全|3617 次阅读|0 个评论
[转载]从一篇数学史论文说开去
张胜贵 2010-10-16 17:29
从一篇数学史论文说开去 美国数学协会(MAA)的机关刊物《数学杂志》(Mathmatics Magazine)2003 年10月号上登载了一篇耐人寻味的数学史长篇论文莱布尼茨、《易经》和中国人的宗教转化, 该文通过比较翔实的史料回顾了清朝康熙年间,世界有名的大数学家莱布尼茨和在中国的传教士科学家布韦等人,试图利用《易经》中八卦图和二进制数系中自然数的类似表达方法作为根据,去说服康熙皇帝及其左右,以达到他们把中国人转化为基督徒的目的,同时也重现了莱布尼茨当初试图把他的二进制运算解释为宇宙语言的勃勃雄心, 该文作者弗兰克施维茨是一位数学史家,对中国的数学史特别有兴趣,但可能是由于对中国的社会和宗教等背景知识的了解不足,这篇长达16页的论文的结论部份却令人惊讶地贫乏,简直就没有结论可言, 尽管如此我们却发现该文提供的史实不但能给我们有趣而有益的结论,而且为我们提供了一个很好的实例,足以演示比较东西方科学内涵大小的方法,因而明白历代科学家们在处理东方传统科学时往往不成功的原因, 为此目的我们将原文作了最大限度的压缩,删去了不影响主题的繁琐细节,尽可能不涉及过多的专有名词和人名,以免分散读者的注意力,而对于一些原文没有细讲、但又特别重要、多数读者也可能不知道的术语和概念(如二进制数系和八卦图的基本概念和构成方法),我们又以译注的形式添加了适当的说明,这样一来只要认真阅读,中学文化以上的读者都能理解本文的基本内涵了, 下面我们就请读者欣赏原文的摘要翻译,然后共同来得出简单明了而又令人惊讶的结论,这一段有趣的历史文字不包含任何超出中学课本的数学内容,因此读者一定会读得轻松愉快, 莱布尼茨、《易经》和中国人的宗教转化 作者弗兰克施维茨 G.W. 莱布尼茨(1646-1716)是一个各种理念的综合家,一个宗教思想家,也是一个喜欢并如饥似渴地了解中国文化的人,他曾经搜寻一种宇宙的语言,来帮助他对全部人类知识进行有序化的探索,在他的搜寻中,他被中国的《易经》所吸引。   这一古代经典的概念和符号看来代表了二进制算法,并由此暗示了一个把上帝和天地万物联系起来的神秘模型,在学习《易经》的过程中,莱布尼茨也卷入了当时在中国的传教士们试图把中国人转化为基督徒的活动,我们在这里考查数学史上这一奇特的篇章,并讨论莱布尼茨是怎样把数学和哲学、宇宙学、神学,以及玄学联系起来的, 1. 莱布尼茨的追求 莱布尼茨确实是一个博学之人 一个全面的天才和欧洲启蒙运动中知识分子的领袖,虽然一般人都知道他和牛顿各自独立地发明了微积分这一犀利的数学工具,但他在数学以外的很多领域内还享有盛誉,作为一个著名的自然哲学家和打破了经院哲学束缚的科学家,他还是一个积极的试验家和发明家。    莱布尼茨在自己周围的世界中搜寻着秩序、结构与和谐,他想发展一种分析化的论证语言,该语言能通过一组基本的人类思想原素的不同组合来表达任何一个概念,如果自然是数学化的,那么天地万物也该是数学化的,于是上帝的形象也能借助于数学而被人们所理解,莱布尼茨便这样把理性和信仰联系起来, 2. 中国的传教士和《易经》 十三世纪时,马可波罗向西方人介绍了自己亲眼所见的中国, 他的奇妙、甚至虚构般的描述点燃了西方人心中的好奇和想象,1497-98年葡萄牙人开辟了直达远东的通商航线,商人和传教士开始访问和观察这个天朝大国。   并把见闻向西方人介绍,1601年传教士们到了北京,这些人都是受过良好教育的神父,是天主教中的高级知识阶层,他们不但专于神学和哲学,而且熟习许多世俗的学问,因而具有在高等学府中担任教师和教授的资格,他们的中国主人对于他们的宗教信条和神秘的教义没有甚么兴趣,但对他们的科学专门知识以及这些知识可能为皇上所用这一点却确实很欣赏,反过来传教士们则发现中国人是一个严守纪律和道德的民族,已经具有许多传教士们希望提倡的精神品质。   结果传教士们转变中国人信仰的策略就包含了两方面的内容首先,把自己植根于中国文化之中,希望能发现中国文明和基督教之间的确切的联系,其次把所得信息传播回欧洲,以保持皇室和民众对中国传教团的支持, 1685年中国传教团请求多派一些科学专门人才去传教,法国路易十四国王在年内便派了六个耶稣会的科学家去中国,其中一人在泰国被国王留下了,其余五人到了中国,这五人中有一个姓布韦(Bouvet应该是中文名字叫汤若望的人吧?)的,是一位天才而博学的学者,他后来成为当时执政的康熙皇帝及其子女们的私人数学教师。    布韦很快就对中国经典文献中的玄学理论和宇宙学信仰产生了兴趣,尤其是那本据说是最古的中文书《易经》,对他具有特别的魅力,他相信这本预言书是神向人作启示的工具,或许是一种正在失去的联系,一种可以从精神上把基督徒和中国人团结起来的古老神学, 布韦相信《易经》源于伏羲(公元前三千年),伏羲据说是中国的第一个皇帝,并在黄河边上有过一次奇遇他遇到一匹龙马,给他带来了八卦图,伏羲便由八卦获得了语言和一切事物的知识,据信八卦来自太。   而太极则通过互补的阴和阳这个二元系统控制着一切事物,(译注阴和阳在八卦图中分别以中间断开和不断开的横线来表示,这些横线都叫作爻(读音同瑶),利用三根横线(三爻)的不同组合,可以排出8种不同的图形(8种卦象),把这8种卦象按一定次序排成一个首尾相连的环形图,就成为八卦图,简称八卦利用六爻的不同组合则能排出64个不同的卦象,其组成的圆环图则是六十四卦图,但人们习惯上仍然叫它八卦。   这里的爻数和卦数的关系是通过中学数学书上讲的排列组合公式而来的2的3次方等于8(2对应阴和阳,3对应爻数8对应卦数)2的6次方等于64,但由于八卦中每一卦象自身内涵的完整性,人们一般只把两个三爻的八卦图迭加、组合成六爻的六十四卦图,而不用四爻来作十六卦图或用五爻来作三十二卦图,) 由于充满智慧而又古老的天朝里的一切知识都溯源到伏羲和《易经》,布韦认为这位圣王便是中国的精神和智慧之父,他会不会就是犹太 基督信仰中的亚当呢?如果是,则在正确理解的前提下,《易经》就能产生出宗教思想家们正在寻找的古代神学,特别是他觉得《易经》可以为转化中国人的宗教信仰提供必要的联系, 3. 莱布尼茨的二进制运算 如果上帝是最伟大的数学家,就如当时许多神学家和哲学家所相信的那样,那么他用了哪些数来设计这个宇宙呢?关于数基的概念,即把任何数表示为某一特定数字(数基)的幂的和的想法,人们在十六世纪就知道了,并且已能使用不同于十的基,我们通常使用的基为十的数系叫做十进制数系,基为二就叫做二进制数系,英国数学家Thomas Harriot (1560-1621) 就曾经考虑过二进制数系,但当时觉得没有实用价值,一位西班牙主教在1670年考虑过从二到十二为基的数系,可是上帝用的是哪个数基呢?曾经是莱布尼茨的数学老师的数学家Weigel认为,答案应该是四,他的答案可能来自当时流行的宇宙学观念世间万物都是由四大原素地、水、火、空(气)组合而成的, 莱布尼茨却偏爱二进制,在他看来那是最简单、最有效的数系,他在一篇发表于1679 的文章中讨论了二进制数学并构造了一个二进制数字计算器,在一年之内,莱布尼茨又为一位公爵规划了一部这样的机器,但同时也注意到了在构造上的技术困难,1682 年他讨论了二进制过程及其在数论中可能的运用,然而莱布尼茨对二进制运算的兴趣超越了数学而包含了玄学和神学,莱布尼茨在1690年的一篇文章中说,万物来自虚空原始的虚空便用0来表示,而作为造物主的上帝就用1来表示,宇宙万物的形成则来自1和0的组合,到1697年他把自己的想法和在中国的传教士进行交流,以便他们能使用他的理论去给予中国皇帝一个深刻的印象, 4. 莱布尼茨的二进制运算和伏羲 因为受到奇特和新颖事物的强烈吸引,莱布尼茨成了一个机敏和如饥似渴的中国文化的爱好者,热情地收集着来自这一片令人好奇的土地上的信息,他在1668年写过对中医的评论文章,后来又参与过对中国语言的讨论,在1689年访问罗马时,他结识了一位在中国呆了十七年的传教士,从他哪里获得不少关于中国的资料,1697年4月他编写了来自中国的最新消息,当时在巴黎的布韦读到了他的文章,他们从此建立起通信联系,布韦还将自己写的康熙皇帝的传记寄给了莱布尼茨,莱布尼茨在给布韦的回信中谈到了自己正在寻找的宇宙语言,并提到其可能被用来向中国人传达基督教的概念, 1698年2月28日,当时布韦还在法国,他向莱布尼茨讲了自己的想法,特别强调了伏羲和《易经》的卓绝不凡,认为《易经》中的六爻图形是神的启示的知识源泉,他又向莱布尼茨介绍了一本书中的六爻图形,莱布尼茨对这一理论很感兴趣,并于1701年2月15日给布韦的信中详细介绍了他的二进制运算理论,强调了其中上帝从虚空中创造万物的内涵,还附了一张用二进制数系表示从0到32的表格,布韦立刻就注意到表中的0和1与伏羲八卦图中的阴和阳的对应关系,布韦很高兴自己的想法得到了证实,并在回信中又附了一张刻版印刷的先天八卦图,伏羲的先天八卦图与后来周文王画的后天八卦图在六爻的排列次序上是不同的,莱布尼茨的二进制数系中0和1的排列顺序则和先天八卦图中的阴阳排列顺序相吻合,布韦是第一个注意到这一联系的人。    看到自己的二进制数系与远古的伏羲八卦图有着良好的对应关系,莱布尼茨在回信中表达了自己的喜悦,他甚至想象,当初伏羲画八卦图时,说不定心中已经想到了《圣经》中创世纪里的经文,不过当莱布尼茨把后天八卦图拿来与他的数系比较时,却发现漫无头绪,使人深感迷惑, 1702年莱布尼茨采取了一系列步骤来使他的二进制运算在科学界内广为传播,在1703年的法国皇家科学院备忘录上,莱布尼茨发表了二进制运算的解释,除解释二进制概念外,还指出其在科学考查中的用处,阐述了它与中国的联系,作为例子他用表列出了伏羲八卦图和0到7这八个数字的二进制表示之间的对应,(请参看附表) 5. 共同合作的结果 莱布尼茨在1716年逝世,没有亲眼看到这一重大事件的结局,他也从来没有和布韦见过面,布韦也一直没能成功地运用他的理论赢得中国人宗教信仰的转化,并于1730年逝世,但在一段时间内,两位富于创造性的思想家却相信他们发现了联结东方与西方、过去与现在、以及中国的儒家和欧洲的基督教文明的纽带,哲学家莱布尼茨认为他发现了人类知识的一个根本来源以及他努力追寻的宇宙语言的关键,布韦则相信伏羲是第一位预言家。   是神的启示的接受者,在他们的合作中,他们互相补充和加强了各自的信仰, 6. 结论 把伏羲的八卦图解释为古代数学知识的重新发现,曾在18世纪初期的知识界引起过一阵轰动,一位杂志主编在1705年撰文宣称,中国人失去了六爻图的真正意义,一位欧洲天才为他们重新发现了这一知识,但几年后莱布尼茨对于《易经》及其六爻理论的新发明便几乎被忘掉了。    在二十世纪初,随着儒学经典的英文翻译和《易经》的德文解释的出现,西方世界对于六爻及其意义的兴趣又重新显露出来,精神分析法奠基者之一的荣格(C.G. Jung),在自己的文章中赞许了六爻的超自然力量,把他的追随者们吸引到这一思想中来,尽管他们的解释有些奇异和怪诞,《易经》及其六爻在数学上仍然具有吸引力,并且提出了一个至今没有解决的、为六爻的排列顺序找出一个数学逻辑的问题。   迄今为止已有几种有趣的理论试图为此问题提供答案, 莱布尼茨-布韦通信集的重要性,及其与《易经》、六爻和二进制数的关系又重新得到检验和研究,从1929年直到1973年,出现了一系列的研究文章,最近两位研究者正在准备出版一本英文版带注解的莱布尼茨-布韦通信集。   此书的面世将为广大读者提供对于那一段涉及到莱布尼茨、布韦、二进制运算、宗教信仰的转化、以及《易经》的奇异历史片段的深入理解,(原文摘译完) 下面我们就仅仅以上述文章摘译和对二进制运算、八卦的基本理解为基础,得出一些简单明确而又发人深省的结论, 1. 八卦和二进制数系的内涵有天壤之别 当莱布尼茨在他的时代首先想到用0和1来表示世间一切事物时,他的思想无疑是伟大而卓绝的,这一点已经被后来的计算机科学的飞跃发展所证实了计算机和莱布尼茨的二进制运算机器主要的只是速度快慢的差别,但当莱布尼茨试图用他的二进制运算来解释八卦的各种卦象时,他便犯了一个明显的逻辑错误以小概大。    用二进制数系表示自然数时,其中0和1的排列顺序是不可更改的,也就是一个线性序列,因为它所表示的自然数是按线性序排列的,但八卦卦象的排列是环形的,没有首尾的区别,每一个卦象与自己左右两边的卦象的推演关系是确定的,无论把哪个卦象算作第一个。   都不影响任何一卦的内涵和它与其它卦象的关系,以三爻组成的八卦图为例,我们可以从任一卦象处断开,得到一个卦象的线性序列,一共可得八个不同的这种序列。   而其中一个(即先天八卦图)和二进制数系表示的从0到7这八个数的二进制表示法可以完全对应起来(0和阴爻对,1和阳爻对)换句话说二进制数系表示的内涵顶多只是八卦图表示的内涵的八分之一,对于六爻作成的64卦图,相应的二进制数系表示法就至多只能表示其64 分之一的内涵,随着爻数的增加,它们之间所表示的内涵的差别就越来越大, 因此当莱布尼茨试图用他的二进制运算来解释八卦的各种卦象时,他不但是以升量石,而且简直就是以斗量海举例来说吧,把两个64卦图重迭、重组一次,就得到由12爻组成的4096卦图,可以断开成4096个线性序列,而相应的二进制数系表示法仍然只能对应其中一个,因而只表达其4096分之一的内涵,再重迭一次,就超过一千六百万倍了, 这两种表示法之间内涵的重大差别是任何一个稍有逻辑的人都能想到的,但莱布尼茨由于先入为主地把自己心爱的二进制数系当成了宇宙语言,因此无论甚么东西都想用它来解释,再也顾不上冷静的逻辑思考了,甚至在他已经遇到了后天八卦图与自己的二进制数系相矛盾时,也没有抓住使自己明白更大真理的机会,不管多聪明的人。   一旦被强烈的执著心蒙蔽了智慧,就可能犯一些平时根本不可能犯的错误, 2. 如果莱布尼茨说《易经》就是他要找的宇宙语言呢? 那他在二进制运算方面的整个辛勤劳动就具有了大得多的价值,用现在的话来说,他的二进制数系就是先天八卦图的一个很好的数学模型,莱布尼茨已经注意到了后天八卦图给他的二进制数系带来的麻烦,他实际上马上就可得出结论说,八卦图的内涵远非二进制数系可以完全模拟。   然后他只消放下自己的二进制数系,捡起圆溜溜的八卦图就得了,但话又说回来,对于八卦图的内在逻辑的数学表示既然至今也没有完美的结果,那么莱布尼茨在当时不能超越时代、认定八卦图是他要找的宇宙语言也就成了历史的必然了, 3. 二生万物与现代计算机科学 现代计算机科学是从莱布尼茨当初的二进制计算器发展而来的,但从一定的程度上来说,现在计算机科学所作的一切。   就是从一个方面演示了二生万物这一道家思想的部份内涵,我们不妨用一个最简单的方法来说明这一点, 当今人类的全部知识都可以通过某种方法输入计算机中贮存起来,因此它们的任何部份都可以用有限个0和1的不同组合来表示,如果把所有这些表示式连接起来,我们就得到一个仍然是由有限个0和1组成的特殊排列,这一表示式可以解读为二进制数系中的一个数。   也可按原来的次序还原为人类的全部知识,假定这一表示式由100亿个0和1组成,那它就与100亿根爻线排成的2的100亿次方个卦象的某一个序列相对应,可以想象2的100亿次方个序列中的一个就记述了迄今人类的全部知识,那它们加起来所能表达的内涵就是一个不可思议的知识的汪洋 再反过来说二生万物吧,只要存在两种可以互相区别的最基本的物质元素,则由上述讨论可知,通过层层迭加和排列的办法。   就能生成任意多的具有不同性质的新物质来,道家认为万物来自虚空,即有生于无,这个有便称为一,然后一生二,这个二就是阴和阳,而八卦的推演和构成就可看作对二生万物,即万物都来自阴阳的一种诠释。    总而言之迄今为止人类全部知识的总和,也还是由有限根爻线所画成的一切可能的卦象组合中的一个而已,我们人类已经走了五千年以上的文明之路,从某种意义来讲,我们至今也还没有走出伏羲所画的八卦图去。
个人分类: 未分类|2 次阅读|0 个评论
这闹钟够数学的
jiangxun 2010-8-10 08:07
作者:蒋迅 这是我的同事的一个闹钟。我特地拍下来给这里的网友们瞧一瞧。可能你一下子看不出它怎么会是一个钟呢。原来它是一个用二进制表示的数码钟 ( binary clock )。真要适应它,恐怕不是一时半会儿。不过,据说搞科学的人很喜欢它。这里有一个 在线的二进制时间 。 上面这张示意图可以帮助你理解如何看懂这个钟上的时间。原来它还不是一个完全的二进制表达。不过, 完全二进制的钟表 也已经面世。不过,人们可能更难看懂时间了。
个人分类: 够数学|6828 次阅读|0 个评论
从两个游戏谈信息量
武际可 2010-6-24 10:44
文章可能不太清晰,上传一个pdf文档: 从两个游戏谈信息量.pdf
个人分类: 科普|4660 次阅读|2 个评论
莱布尼茨与八卦
热度 1 梅珍生 2010-5-10 18:21
闻操恭(文抄公?) 德国自然科学家莱布尼茨(G.W.Leibniz,1646~1716)于1703年4月发表题为《二进位制计算的阐述关于只用零与一,兼论其用处及伏羲氏所用数字的意义》的论文。   此前,他将二进位制表寄给在中国传教的法国教士白晋(J.Bouret,1656~1730)。白晋回信说明二进位制与伏羲八卦的六爻有关,并附寄六十四卦图。   莱布尼茨回信说:伏羲是中华帝国和东洋科学的创造者,这个易图是流传于宇宙的科学中最古的纪念物。宇宙一切从--与而来,即从0与1而来。中国人在四千年前已了解到0与1的二元数学,已有科学上的大成就。我发现二元算术,不外是0和1之应用,也就是无与有的运用,仅于阐明中国古代的纪念物上,发生重大的效用。 文史杂志 2009年第3期 连超牛大科学家都觉得学《周易》有必要,比如莱布尼茨、比如量子力学?何况一般的官员? 萧萐父先生谓:今天的易之三义:神道易、科学易、人文易!
个人分类: 冷眼热心|10108 次阅读|2 个评论
人生与二进制数据
yhc511025 2010-4-23 15:32
今天看到一本书,谈到人生的选择,突然想起计算机里面的二进制也是一种选择。于是想了想这两者之间的联系。 计算机里面的二进制数据有两个重要的参数,一个是位数,另一个是每一位对应的值。人的一生简单说来也有两个重要的参数,一个是机遇的次数,另一个是面临每次机遇所做的选择。 计算机二进制数的位数不能确定,但是每一位都面临着两个值可选,要么是 0 ,要么是 1 ,将选择的每一位连接起来,便成了一个计算机二进制数。而人一生面临机遇的次数也不确定,但是面临机遇时的选项也只有两个,做或不做,将每次面临机遇时所作的选择连接起来,也就构成了人生的过程,这个过程也可以像计算机内的数据一样用二进制编码来表示。 上面只是简单的将人生和计算机数字世界联系起来。随着科技的发展,也许某一天真能实现真实世界和虚拟世界的无缝链接!
个人分类: 生活点滴|2702 次阅读|1 个评论
一个象棋残局的启示
热度 1 武际可 2010-3-8 19:56
一个象棋残局的启示 武际可 下图是一个象棋残局。先走的一定胜。请试一试你的手段。 稍加分析,我们看出,红黑双方,只有边炮、中炮和七步兵能够往前移动。其他着法都会失败。 这三个子,能够前进的步数,分别最多是8、4、1步。谁最后没有步走时认输。 这个残局,对应于下面的一个游戏: 设有三堆火柴,分别为l 、m 、n 根,二人轮流从三堆中的任一堆中取任意根火柴,谁取最后的火柴,谁胜。在残局的情况,l 、m 、n 分别为8 、4 、1 。 为了得到必胜的策略。第一步,我们把l、m、n分别表示为二进制数。在残局的情形就是1000、100、1三个数。 第二步,把三个数按位数对齐,每位相加。在残局的情形对应的是1101。从三堆中的某一堆中取适当数目的火柴,使剩下的三堆二进制表示的数位之和,每位都是偶数。在残局的情形,从8中取三,即剩101、100、1,这时的数位和是202。对应地就是边炮前进三步。试证明对于任意的 l 、m 、n 这总是能够做到的。 于是我们得到结论如下:如果甲轮到取火柴时,三个数的二进制数位和的每一位都是偶数,则他无论怎样取火柴,都会使数位和至少一位变为奇数。乙总可以适当取火柴使数位和恢复偶数。因为最后全取光时的数位和是偶数。所以甲是输定了的。如果甲轮到取火柴时,三个数的数位和,不全是偶数。我们说按照第二步的策略,甲肯定能够取得胜利。即最后一根火柴肯定是他取的。 这样分析后,这个残局对先走的人必胜策略就是很容易实现的了。 博弈论告诉我们,任何胜负分明没有和局的游戏,总存在对某一方必胜的策略。我们这个残局和对应的取火柴的游戏正是如此。而且数的二进制在这个残局和取火柴游戏的取胜策略中也得到巧妙的应用。
个人分类: 科普|8681 次阅读|13 个评论
二进制算数与先天图
gl6866 2009-6-11 18:36
近几十年来学术界讨论的一个非常热门的话题就是:德国大哲学家、数学家莱布尼茨的“二进制算数”当时叫做“二进制级数”,即逢二进一的计数方法与邵雍先天图的关系。参加这场讨论的有西方包括英国科学史家李约瑟博士在内的,以及国内许多著名的科学史与中国哲学史的专家学者。但是他们讨论的焦点大致集中在两点:首先,邵雍的先天图卦序是否就是二进制的记数方法?或是一种“无意识的巧合”而符合二进制的记数方法关系?其次,莱布尼茨发明二进制算数是否受了邵雍先天图的启发?主流的学术观点认为邵雍的先天图不是二进制记数方法,或至少不是一种自觉运用的二进制的记数方法;莱布尼茨在其发明二进制之前并未看到邵雍的先天图。 对于主流学术观点,国外早已有了相应的评论,也就是说,莱布尼茨肯定是先看到了先天图,然后才有了自己的工作。但是我的问题是,邵雍的先天图是否就是一种目前我们所谓的“二进制计数”的方法呢?我的回答则是否定的。它与当前与我们用的计算机的二进制算数没有任何关系。因此,在我看来,无论是主流的和非主流的观点似乎都未说到要害之处。现在,我还是要从另外一个角度探讨一下这个问题。看邵雍的先天图如何能与二进位制计数联系起来。 《周礼·春官》曰:“大卜掌三易之法;一曰《连山》,二曰《归藏》,三曰《周易》。其经卦皆八,其别卦皆六十有四。”这里所说的《连山易》、《归藏易》,其书在汉初亡佚,现无据可考,难度其详。从此,《连山》与《归藏》成为中华文化领域里的一件千古之谜。目前所见到《周易》是经过孔子的增删分和所成。孔子对于《周易》的修订,的一个关键点就是将读卦的顺序从坤卦始而变革为从乾卦始。这就是《周易》中的后天图。可是,孔子的改变卦序的做法,从此决定了中国数千年男尊女卑的地位。而据信在殷商流行的《连山》与《归藏》,则是坤卦始,从某种意义上反映出母系社会的痕迹。 而宋代邵雍的先天图在我国易学领域引起的是另一场革命。其革命对象便是针对文王后天图而来的。邵雍的先天图无论八卦还是六十四卦,其卦序顺读都是始于《乾》而终于《坤》,我们的绝大多数学者都按顺读的方法来读它,我特别强调是绝大多数学者都是按照先前那个后天图的卦序来读邵雍的先天图卦序的,这就无法理解到邵雍革命的妙道所在。因而,也就很难发现其中所蕴涵的二进制的记数方法。可是邵雍在其《皇极经世书》(卷十三)指出:“夫易之数,由逆而成矣。”他告诉我们考察先天图的易数关系的要诀是“逆数”,其中包括卦序的“逆数”和爻序的“逆数”。卦序的“逆数”是从《坤》卦至《乾》卦,中国素有“顺则人、逆则仙” 的说法。而邵雍的先天图的卦序都遵循着这样一种逻辑法则,被称为“加一倍法”。所谓“加一倍法”即是今天严格意义上的“二进制”的记数方法。朱熹称其为 “加一位法”,那么,今天我们便可以不再根据传统的卦画的方式来重新表述先天图,而是改变符号,根据当前流行的阿拉伯数字重新制作出一张以0和1为基础的自然数表,从而使其与当代计算机的基本处理方式联系起来。 正如大科学家爱因斯坦曾经指出的那样:“事物的这种真理必须一次又一次地为强有力的性格的人物重新加以刻勒,而且总是使之适用于雕塑家为之工作的那个时代的需要;如果这种真理不总是不断地重新创造出来,它就会完全被我们遗忘掉。”
个人分类: 学术论文|6697 次阅读|3 个评论
莱布尼兹、二进制与《周易》-(转载)
chrujun 2009-4-19 22:40
莱布尼兹、二进制与《周易》 http://www.whyandhow.org 科普知识 二进制是一种非常古老的进位制,由于在现代被用于电子计算机中,而旧貌换新颜变得身价倍增起来。或许是出于证明我国古代人的伟大智慧这样的好心吧, 许多人从我国伟大而神秘的《周易》中发现了二进制。当有人发现莱布尼兹曾将二进制与中国《周易》联系在一起时,就自认为找到了一个更为有力的证据。于是, 一个神话就被泡制出来了。其大意是:莱布尼兹通过在中国的传教士,得到了八卦图,他领悟到只要把八卦中的阴爻代表0,阳爻代表1,就可以创立一种新的记数 法:二进制。这一神话虽经部分数学史家之批驳,但至今仍广为传播。因而,我们有必要更详尽地对莱布尼兹、二进制与《周易》三者的关系做一澄清、说明的工 作。 莱布尼兹与二进制 二进制记数法的历史常与莱布尼兹联系在一起。但事实上,莱布尼兹并不是这种记数法的最早发现者。在他之前已经有人提出过这种记数法。如十七世纪初, 英国代数学家哈里奥特在他未发表的手稿中提到了它。1670年卡瓦利埃里又一次重复了这一发现。莱布尼兹大概未见到过前人的论述,所以当他重新发现二进制 时,他一直以为这是自己的独创。不过,由于二进制是在莱布尼兹的大力提倡和阐述下,才引起人们关注的,所以把二进制与莱布尼兹联在一起作为一种已习惯的说 法也无什么不当之处。 莱布尼兹重新发现二进制的时间大约是在1672-1676年。1679年3月15日,他写了题为《二进算术》的论文,对二进制进行了充分的讨论,并 建立了二进制的表示及运算。1696年,他向奥古斯特公爵介绍了二进制,公爵深感兴趣。1697年1月,莱布尼兹还特地制作了一个纪念章献给公爵。上面刻 写着拉丁文:从虚无创造万有,用一就够了。由此可看出,莱布尼兹对二进制的极大偏爱存在神学方面的原因。在他看来,一切数都可以用0和1创造出来,这 正可以作为基督教《圣经》所说上帝从无创造有的象征。也就是说,从二进位制中,莱布尼兹发现了上帝创造世界的证据。 莱布尼兹为奥古斯特公爵制作的二进制纪念章 1701年,莱布尼兹将关于二进制的论文提交给法国科学院,但要求暂不发表。1703年,他将修改后的论文再次送给法国科学院,并要求公开发表。自此,二进制开始公之于众。 莱布尼兹与《周易》 莱布尼兹是一位有着极其广泛兴趣的学者,他的研究领域涉及到数学、哲学、逻辑学、力学、地质学、法学、历史、语言、法律及神学等,被誉为百科全书式 的人物。他兴趣的触角也伸向了中国。从年轻时候起,他就通过广泛阅读了解中国传统文化。1689年,莱布尼兹认识了从中国返回的耶稣会士闵明我。两人交往 数月。1694年,当闵明我再次回中国时,莱布尼兹交给他一个希望了解中国的提纲,共30项之多,几乎包括了所有的知识领域。1697年10月,另一位著 名的法国传教士白晋与莱布尼兹开始了通信。1697年12月,在与白晋的通信中,莱布尼兹阐明了自己的二进制观点。1701年11月,白晋从北京给莱布尼 兹回信,信中告诉他伏羲六爻的排列与二进制记数法的顺序是相同的。白晋还随信附上了伏羲六十四爻排列的木版图。经过辗转,1703年4月1日,莱布尼 兹收到了这封信,并看到了伏羲易图。几天后,他完成了上述那篇递交给法国科学院的论文。此论文的题目是:《关于仅用0与1两个符号的二进制算术的说明,并 附其应用以及据此解释古代中国伏羲图的探讨》。透过这个长题目,不难窥出莱布尼兹在此论文中不但阐明了二进制,而且已经把它与中国的八卦联系在一起了。他 为几千年前中国圣人的创造与自己的发现相一致而高兴,并为自己解开了《周易》之谜而欣喜若狂。 拉普拉斯普在他的名著《概率的哲学探讨》中曾评论说:莱布尼兹在他的二进制算术中,看出了创造万物的影象他想象:一代表上帝,零代表混沌;上 帝由混沌中创造出世界万物,正如在他的记数法中用一和零表示一切的数一样。这个观念太使莱布尼兹喜欢了,所以他将它提交任中国数学院院长的耶稣神父闵明 我,希望因这种创世界的象征,而使非常喜欢科学的中国皇帝也转信耶稣教。我提到这点,目的只在指出,即使是大人物的眼睛,也会被幼稚的偏见所蒙蔽! 《周易》与二进制 莱布尼兹将自己的发现结果与中国古代圣哲伏羲的思想联系起来,认为自己揭开了数千年前中国的一个不可解之谜。那么,莱布尼兹是如何把二进制与《周易》联系在一起的呢?当他把自己的发现与《周易》联系在一起时的证据又是什么呢?为了做出说明,我们需要简单提一下《周易》。 《周易》,包括本文和解说两部分,本文内容叫做经;解说部分叫做传。经由64个卦组成,每一个卦,又是由称为爻的两种符号排列 而成。――叫做阴爻,──叫做阳爻。这两种爻合称两仪。如果每次取两个,会得到四种排列,称为四象;如果每次取三个,会得到八种 排列,称为八卦,如果每次取六个,那么会得到64种排列,称为64卦。现在我们把阳爻看作数码1,阴爻看作数码0,于是我们就可以把各种卦转化为 二进制中的数了。如由6个阴爻组成的坤卦可看作是:000000(相当于十进制中的0),而由6个阳爻组成的乾卦可看作是111111(相当于十进制中的 63)。 邵雍的六十四卦方圆图 莱布尼兹把自己的二进制与《周易》联系在一起的依据是白晋寄给他的易图。这一易图的顺序是:坤(000000)、剥(000001)、比 (000002)、观(000003)、豫(000004)一直到乾(111111),恰好是二进制记数法从小到大0到63这64个数的排列。 因而,莱布尼兹从这幅易图中解读出二进制倒是容易理解的。但当他把二进制与中国古代圣人伏羲联系在一起时,他却犯下了一个他无法想到的错误。因为他 所见到的这幅图并非来自几千年的伏羲,而是宋代哲学家邵雍改画的,并非《周易》的原图。《周易》现存本子有两种排列。一是通行的《周易》本,顺序是:乾、 坤、屯、蒙既济、未济。换成二进制是:111111,000000,100010,010001101010,010101。对应于十进制 是:63,0,34,1742,21。每一对卦都具有某种对称性,但看不出与二进制记数法有什么联系。另一种本子是长沙马王堆汉墓出土的帛书,其中顺 序是按乾、否益排列的,也看不出与二进制的关系。 与64卦相似,常见的八卦也有两种不同的排列方法。其中一种排列方法恰对应于二进制记数法的0,1,2,3,4,5,6,7。而另一种排列则不具有这种对应关系。因此在八卦与二进制之间存在联系的说法同样是缺乏依据的。 通过上面的介绍,我们可以得出一些结论。首先,我们可以肯定地说:莱布尼兹受《周易》影响而发明二进制,这一在中国流传甚广的说法是完全背离实际情 况的。因为莱布尼兹远在接触到《周易》之前就已发现了二进制。其次,当莱布尼兹认为中国早在几千年前的《易经》中就已有了二进制思想时,他使用了错误的证 据,他误把宋代人邵雍的易图当成了伏羲的。因而,这只是一出错误的喜剧而已。如果把莱布尼兹的说法作为中国早在几千年前的《易经》中就已有了二进制思想的 依据,那可就太往我们古人脸上涂金了。当考虑到不管是八卦还是64卦,其排列顺序都不唯一时,我们就更有理由否定《周易》中有二进制思想的结论了。在二进 制与《周易》的关联方面,我们最多可以说《易经》的八卦中无意识巧合碰上的东西,被莱布尼兹有意识地发现了(李约瑟语)。 不过,我们也可以换一种角度来看一下这个问题。即把《周易》看作一种具有开放性的经典文本,后人可以对它做出不同的解释。在这种解释学立场下,我们 就没必要否认莱布尼兹用二进制解释邵雍易图的合理性,也没有必要反对《周易》中蕴含着二进制的说法了。作为对经典的一种解读方式,把两者联在一起是有道理 的,可以看作是对经典的一种创造性的发挥。只是,我们必须要严格区分开这种新的解读方式与古人原意之间的差距,注意不要把后人在新视角下看到的东西非要安 到古人身上,并美其名曰:弘扬中华民族古代智慧。可以说,不合情理地往我们古人脸上涂金的做法如果不是出于无知,那么只能是出自于一种过度的民族自卑。
个人分类: 转载精品|10694 次阅读|0 个评论
《周易》、二进制和计算机 -(转载)
chrujun 2009-4-19 22:37
《周易》、二进制和计算机 作者:王乃信   大家知道,在电子计算机中,信息、指令、状态都是用 二进制 数表示的,运算、处理也是用 二进制 数进行的。随着计算机的普及, 二进制 愈来愈成为人们津津乐道的话题。   在数学史上, 二进制 数系是和德国伟大的数学家Leibniz(1646-1716)的名字联系在一起的。现在流行着一种时髦的说法,说 二进制 来源于中国,因为《周易》中早已有了 二进制 。还有人进一步发挥说,既然 二进制 来源于中国,那么,计算机的老祖宗也应该在中国。某大报在头版头条论述所谓留给二十一世纪的悬念的文章中就说,Leibniz受《周易》启发,发明了 二进制 和计算机。 易经中六十四卦的排列次序,即所谓乾、坤、屯、蒙、需、讼、师、比等,是很混乱的。在考古发现的易经古本中,六十四卦的排列次序就完全不同,但也同样是很混乱的。这些排列次序均与 二进制 无关。易传中的序卦是专门解释六十四卦的排列次序的,但多为牵强附会之同,连自圆其说都谈不上,根本没有 二进制 的影子。易经将六十四卦划分为三十二对,其中占大多数的二十八对,其相对两卦的六爻是彼此上下颠倒的,这与 二进制 毫无共同之处。易传说:易有太极,是生两仪,两仪生四象,四象生八卦。这似乎是《周易》中与 二进制 有关的话。但这实际上只是一种原始的一分为二的思想,与 二进制 仍然没有必然的联系。易传在讲述八经卦时,分八经卦为阴阳两类:乾、震、坎、艮,交画为三,为五,为奇致,故称阳卦;坤、巽、离、兑,爻画为六、为四,为偶数,故称阴卦。这种划分与太极、两仪、四象、八卦的一分为二思想格格不入,这里的所谓的奇偶与 二进制 数的奇偶也是风马牛不相及的。归根结底,《周易》中是找不到 二进制 思想的。   不可否认,邵雍所创造的六十四卦图确实有朴素的 二进制 思 想。邵雍是一个素养较高的理学家,他有许多值得称赞的创造。他发展易传中太极、两仪、四象、八卦的一分为二思想,并将其贯彻始终。他按照这种思想,重新排 列出八经卦的次序:乾、兑、离、震、巽、坎、艮、坤,进而依次重之,排列出六十四卦的次序。邵雍以伏羲的名义,画出了所谓伏羲八卦次序图、伏羲八卦方位 图。伏羲六十四卦次序图、伏羲六十四卦方位图。这是《周易》中原来没有的崭新的图,也就是 Leibniz所看到的图。因此,Leibniz对伏羲以及文王、周公、孔子的赞叹确系张冠李戴。邵雍还画过所谓天地始终之数图,以及许多其他的图,并引 入辰、日、月、岁、世、运、会、元等时间单位,交替用十 二进制 和三十进制,构成一个复杂而规律的计数系统。但是,我们不得不指出,邵雍虽然提出并交替使用了十 二进制 和三十进制,却从来没有以任何方式提出或暗示过 二进制 计数法。肯定地说,邵雍在他的六十四卦图中所蕴涵的 二进制 思想是不自觉的。邵雍所关心的是如何在他的宇宙模式下把万事万物纳入数的范畴,因而,他不可能在数学上再前进一步。   还必须指出, 二进制 的产生与计算机的产生并没有必然的联系。1794年,Leibniz设计并制造了人类有史以来的第一台能进行四则运算的机械计算机。尽管:Leibniz早在十五年前就建立了完整的 二进制 数系及其运算规则,但他的机械计算机仍然用的是十进制。另外,如果把不同数位上的不同数字视为不同状态,那么表示某一范围的数时,不同进位制所需的状态数各不相同,从而有优劣之分,其中 二进制 并不是最优的,三进制才是最优的。从计数和运算的角度看,各种进制并无区别。电子计算机采用 二进制 ,是因为 二进制 运算规则简单,并且容易在物理上实现。由此看来,即使邵雍确实为《周易》注入了朴素的 二进制 思想,我们也是无法把《周易》与计算机直接联系起来的。 转自:http://www.stonerain.net 陨石站 4f4    我们的祖先创造了灿烂的古代科学文化,这当然是应该引以自豪的。但是,我们也不得不承认,由于我们的固步自封,欧洲文艺复兴以后,我们的科学文化就一步 一步、愈来愈远地落在列强之后,这正是我国近代史上屈辱、挨打的重要原因之一。我们要汲取血的历史教训,决不可重蹈覆辙。对于祖先创造的古代科学文化我们 要实事求是地取其精华,弃其糟粕,继承之,改造之,发展之,切不可夜郎自大,沾沾自喜,躺在遗产上睡大觉,切不可盲目地以为我们的祖先把一切道理都说清 了,切不可自欺欺人地把现代科学的成就硬归功于我们的祖先。科学文化的发展是有其规律的,违背它,或者超越它都是错误的。我们不能苛求我们的祖先。在宣传 我国古代灿烂的科学文化时,一定要尊重历史,切不可随心所欲地说过了头。因为,即使是真理,如果说过了头,也会变成谬误。
个人分类: 转载精品|8936 次阅读|0 个评论
莱布尼茨与易学的数理派
gl6866 2009-3-7 22:04
按:这是几年前我为两岸三地在安徽开会时准备的一篇论文的摘要。但是由于身体原因,我没有去成。然而,我的思路已经形成,这篇文章还是要继续做下去的。现在将它发在博克上,让大家讨论一下我的思路,同时也能启迪我的进一步的思考。 从信息哲学的角度看易学的数理派 莱布尼茨、白晋、五来欣造、刘百闵等关于易学的研究与传播 易学研究在我国素有象数和义理两派,致力于对其哲学意义的阐发。然而,自从宋儒邵雍创作先天图,始创易学的先天之学,朱熹继承了邵氏学说,提出了先天学研究纲领,为易学的数理研究奠定了基础。随着易经在17世纪传播到欧洲时,莱布尼茨在与法国在中国的耶稣会士白晋的通信中获悉邵雍的若干六十四卦排列严整的卦图,并对该图做了二进制的解释。从而在西方首创易学的数理研究而终成大气候。上个世纪初叶日本学者五来欣造在法国求学时,见到欧洲17世纪对儒学的研究,专门来到汉诺威莱布尼茨档案馆研究了莱布尼茨-白晋的通信,并写成专著《儒教对德国政治思想之研究》,其中以很大篇幅谈论了莱布尼茨关于先天图的研究,首次发掘出莱布尼茨所见到的先天易图。但不幸五来关于莱布尼茨易图研究在日本几乎没有影响,原因在于科学史家及易经专家对此不感兴趣,而政治学者则对二进制不感兴趣。后来由台湾学者刘百闵将其中专讲莱布尼茨关于周易学的部分译成中文发表,引起中国学者的注意。到了上个世纪初,莱布尼茨的符号逻辑研究却成为数理逻辑的先声,其基本思想就是将传统逻辑推理转换成演算,而到了本世纪初,国际计算与哲学协会(IACAP)则将莱布尼茨的这一思想视为其事实起点,创立了信息哲学这门以逻辑的变易性为基础的新兴的哲学学科。从某种意义说,中国的易学为西方学术改造做出了支持和论证,如何将在国外兴起的易学数理派与我国传统的学术资源对接起来,无疑为我们提出了崭新的启示和课题。
个人分类: 人物记事|5324 次阅读|1 个评论
玩玩二进制----挑战智力极限之必赢秘笈
famingkuang 2009-2-9 07:00
玩玩二进制---挑战智力极限之必赢秘笈 如果有人问您 1+1= ? 您一定以为他要么脑子进水,要么别有用心,事实上也经常有人这样问我,而我却真的答非所问,因为这个问题已经被世人庸俗化了,问您的人他的答案里 1+1 等于几都有可能。 那么 1+1 到底应该等于几才是科学呢? 1+1=2 嘛,谁人不知! 其实除了 1+1=2 正确之外,还有另一个正确的答案,那就是 1+1=10 这可能吗?当然,因为这是二进制里。二进制就是我们今天要靠它来赢娶美女迟菲最重要的武器。 在二进制王国里只有两个数字 0 , 1 在加法运算里满 2 进位,所以才有 1+1=10 。 今天我们不想讨论二进制本身,我们只想用它来做为赢娶美女迟菲的法宝,但介绍一下二进制和十进制的相互转换是很有必要的,因为等会儿我们要用到它。 那么如何把十进制数转换成二进制数呢? 一般来说就是用除法,我们用十进制里的 10 为例子说明。 10/2=5 。。。。。 0 (右边的 0 是余数,下同) 5/2=2 。。。。。 1 (用上一步得的商做被除数) 2/2=1 。。。。。 0 (同上) 1/2=0 。。。。。 1 (同上) 上列右边的是余数,我们从下到上的顺序把所有的余数写成一排,即得到一组数字 1010 ,这个就是十进制的 10 所转换成的二进制里的数。即: 10 10 =1010 2 在实际使用中,这种方法不是很好用,所以我们介绍另一种方法,我们知道十进制数的个、十、百、千、万。。。位分别代表的是 10^0 、 10^1 、 10^2 、 10^3 、 10^4 、。。。。、 10^n 。二进制数里各数位虽然没有人给它们命名,但从右往左,它们代表的分别是: 2^0 、 2^1 、 2^2 、 2^3 、 2^4 、。。。。、 2^n 。现在我们以 88 为例加以说明: 2^7 (128) 2^6 (64) 1 (6488128) 计算: 88-64=4 2^5 (32) 0 ( 432 ) 2^4 (16) 0 (416) 2^3 (8) 0 (48) 2^2 (4) 1 (4=4) 计算: 4-4=0 2^1 (2) 0 ( 02 ) 2^0 (1) 0 (01) 看中间的那一排 0 和 1 ,按从上到下的顺序把它们写成一排就得到了 1000100 ,这个数字就是十进制中 88 所转换成的二进制数。 88 10 =1000100 2 再看一个: 255 10 = ? 2 2^8 (256) 2^7 (128) 1 (128255256) 计算: 255-128=127 2^6 (64) 1 ( 64127128 ) 计算: 127-64=63 2^5 (32) 1 ( 326364 ) 计算: 63-32=31 2^4 (16) 1 ( 163132 ) 计算: 31-16=15 2^3 (8) 1 ( 81516 ) 计算: 15-8=7 2^2 (4) 1 ( 478 ) 计算: 7-4=3 2^1 (2) 1 ( 234 ) 计算: 3-2=1 2^0 (1) 1 ( 1=1 ) 看中间的那一排 0 和 1 ,按从上到下的顺序把它们写成一排就得到了 11111111 ,这个数字就是十进制中 256 所转换成的二进制数。即: 256 10 =11111111 2 有了这个基础知识,我们就可以来玩玩美女迟菲出的游戏题了。 问题 1 : 一道象 棋的逻辑思维题 上面的图片是小学奥数里的一道题,还是有些难度的,不仅需要有分析能力,还需要懂得如何下象棋。平时我挺喜欢做一些有趣的数学题 ,我觉得这不仅仅能够对自己思维能力锻炼,并且还很有乐趣。 这道题对于乙方有一种必胜的策略,也就是乙方走出一步之后,无论甲方再怎么走,乙方只要不犯低级错误, 就肯定能赢。大家可以思考一下怎么样才能找到必胜策略。 我还没研究透这道题,美女迟菲又在我的博文《 挑战智力极限 ------ 您怎么拿才能赢发发 》 的评论中写道:发发很厉害啊!我来出一道题: 问题 2 : 有三粒棋子,分别距离终点有 59 格, 50 格和 30 格。甲乙两个人轮流移动棋子,每一次可将一枚棋子移动任意多格(允许两枚或者三枚棋子在同一格),所有棋子都移动到终点的时候游戏结束,并且走最后一步的算赢。问,第一个人怎样移动才有必胜的策略? 这两道题本质上是一样的,为了探寻求解之法,我先思考两粒棋子的问题。 问题 3 :有两粒棋子,分别距离终点有 7 格, 6 格。甲乙两个人轮流移动棋子,每一次可将一枚棋子移动任意多格(允许两枚或者三枚棋子在同一格),所有棋子都移动到终点的时候游戏结束,并且走最后一步的算赢。问,第一个人怎样移动才有必胜的策略? 这个问题很简单,只要将距离终点 7 格的棋子移动到第 6 格,和另一粒棋子同步就行了,以后每次都保持同步就能赢了。但是三粒或三粒以上的棋子如何才能保持类似的这种同步的概念呢?迟菲在问题 1 中曾提到了二进制,但当时我还是不明白,思考再三,现在才终于明白了其中的奥秘。例如问题 3 中的 6 和 7 转换成二进制就是: 6 .。。。。 110 7 .。。。。 111 如果我们把二进制里的 1 当火柴棍 0 当空位来处理的话,就很容易理解二进制里同步的概念了。我们把 7 变成 6 就相当于取走了 111 最右边的那根火柴棍。 6 .。。。。 110 6 .。。。。 110 现在不管对方怎么摆弄这两根火柴棍,我们都跟着他就是了。那么三粒棋子能否也用同样的思路处理呢? 我们先来看问题 1 ,对于甲、乙双方来说,左边的兵只可以前进一步,中炮可以前进 4 步,右边的炮可以前进 8 步,横向都不可能走。我们把, 1 、 4 、 8 转换成二进制: 1 .。。。。。 0001 4 .。。。。。 0100 8 .。。。。。 1000 从上面我们可以看出,只有先动 8 才有可能让同位上的火柴棍成双(同步)。于是我们试着将 8 的最左边的火柴棍往右移动一位,但在最右边上又有一根火柴棍不成双(没有同步),我们试着放一根火柴棍在最下边的最右位上,就成了: 1 .。。。。 0001 4 .。。。。 0100 5 .。。。。 0101 现在火柴棍在每一位上都成双了,无论对方取走哪一根火柴棍,我们都跟着在同一数位上拿另外一根就是了。比如对方拿走了 4 上的那一棍火柴棍,我们就跟着拿它下方的 5 左边的那根火柴棍,即: 1 .。。。。 0001 0 .。。。。 0000 1 .。。。。 0001 或者是,对方拿走了 5 右边的那根火柴棍,我们就拿 1 的那根火柴棍。即: 0 .。。。。 0000 4 .。。。。 0100 4 .。。。。 0100 也就是说不管对方怎么拿,我们都跟着他拿相应数位上的火柴棍就是了。 所以问题 1 的解法就是乙方右边的炮前进 3 格。甲方必输无疑。 现在我们再来看问题 2 ,我们同样的把三个数字转换成二进制数如下: 59 .。。。。 111011 50 .。。。。 110010 30 .。。。。 011110 我们观察到从左到右数位上的火柴数分别为 2 根、 3 根、 2 根、 1 根、 3 根、 1 根。有三个单数,我们得想办法把它们弄成偶数。 方法 1 ,对 59 动手,从左往右,拿走第二位、第五位、第 1 位上火柴棍,在第四位上增加一根火柴棍,即: 42 .。。。。 101100 50 .。。。。 110010 30 .。。。。 011110 方法 2 ,对 50 动手,从左往右,拿走第二位、第五位上的火柴棍,在第四、第六位上各增加一根火柴棍。即: 59 .。。。。 111011 37 .。。。。 100101 30 .。。。。 011110 方法 3 ,对 30 动手,从左往右,拿走第二位、第四位、第五位上的火柴棍,在每六位上增加一根火柴棍。即: 59 .。。。。 111011 50 .。。。。 110010 30 .。。。。 001001 以后不管对方如何动,我们都跟着动就行了,只要始终保持同一位置上的火柴棍是偶数就行了。 思考题 问题 4 :有四组牌,它们分别是 5 、 6 、 7 、 8 张,两人轮流去拿,每次只能在某一组里拿,拿多拿少不限(但不能不拿),拿到最后一张牌的人赢。问,第一个人要怎样拿才能保证一定赢? 问题 5 :有 10 组牌,它们分别是 1 、 2 、 3 、 4 、 5 、 6 、 7 、 8 、 9 、 10 张,两人轮流去拿,每次只能在某一组里拿,拿多拿少不限(但不能不拿),拿到最后一张牌的人赢。问,第一个人要怎样拿才能保证一定赢。 问题 6 :类似的题您还能出多少? 问题7:如果允许在两组或两组以上的牌中取牌,题目又该如何出? =================================================== 评论与回复 迟菲: 第四题将8的1000变成100,也就是8变4;第五题可以将8变为3,或者将9变为2,或者将10变为1 发发回复:菲妹,太厉害了,太强悍了!佩服ing. 补充问题1(迟菲贡献): 有四组火柴,个数分别是5,6,7,8,如果允许从一组或者两组中拿,那么先拿的人是否有必胜策略? 发发回复: 这个题有水平。容我想想。要想赢最后必须剩下三根1。我明白了,转换成二进制后,最后一列保持三个1,前面的每列保持3个1或0,每次都这样就行了。到最后一定能保持有三个1给对方先拿。 所以这个题可以这样:将8变成3即可。 菲妹出的题太有意思了。我必须用到两种武器才能解决。一种是《挑战智力极限------您怎么拿才能赢发发 》中的方法,另一种就是今天的方法。再出难点的。呵呵。 ================================================================= 挑战智力极限 挑战 1 :有 7 组牌分别有 5 、 6 、 7 、 8 、 9 、 10 、 11 张,两人轮流去拿,每次可以在一组里拿,也可以在两组里拿,拿多拿少随便,但不能不拿。拿到最后一张的人算赢,第一个去拿的人该如何拿才能保证一定赢? 挑战 2 :有 10 组牌分别有 5 、 6 、 7 、 8 、 9 、 10 、 11 、 12 、 13 、 14 张,两人轮流去拿,每次可以在一组里拿,也可以同时在两组里拿,当然也可以同时在三个组里拿,拿多拿少随便,但不能不拿。拿到最后一张的人算赢,第一个去拿的人该如何拿才能保证一定赢?
个人分类: 一题多出|1401 次阅读|12 个评论
玩玩二进制---铁嘴神算我来当
famingkuang 2009-1-15 15:10
玩玩二进制 --- 铁嘴神算我来当 兴趣是学习之母, 科学知识只有和兴趣结合起来,才能吸引人,也才能让人永生难忘。下面是发发编写的一个利用二进制的性质制作的一个有趣的游戏,你可以把它打印下来和朋友一起玩个痛快。当然玩够了还可以自己编一个出来玩。( 由于图片不太清楚,想玩的朋友可以下载博文末尾处的 附件 ) 表二 1 ( 00001 ) 2 ( 00010 ) 3 ( 00011 ) 4 ( 00100 ) 5 ( 00101 ) 6 ( 00110 ) 7 ( 00111 ) 8 ( 01000 ) 9 ( 01001 ) 10 ( 01010 ) 11 ( 01011 ) 12 ( 01100 ) 13 ( 01101 ) 14 ( 01110 ) 15 ( 01111 ) 16 ( 10000 ) 17 ( 10001 ) 18 ( 10010 ) 19 ( 10011 ) 20 ( 10100 ) 21 ( 10101 ) 22 ( 10110 ) 23 ( 10111 ) 24 ( 11000 ) 25 ( 11001 ) 26 ( 11010 ) 27 ( 11011 ) 28 ( 11100 ) 29 ( 11101 ) 30 ( 11110 ) 31 ( 11111 ) 铁嘴神算表 项目 A B C D E 结论 年龄 出生月份 出生日期 属相 星座 喜欢运动 填表需知: 1, 你不需要直接告诉我什么,你只要在铁嘴神算表中各项目 相应的 A 、 B 、 C 、 D 、 E 上打勾即可。 2 , 比如你的属相在表 B 、表 D 中出现,则你就在铁嘴神算表中的属相栏中的 B 、 D 上打勾;又如果你的出生日期在表 A 、 B 、 D 、 E 中出现,那么你就在铁嘴神算表中的出生日期栏中的 A 、 B 、 D 、 E 都打上对勾。别的依此类推。如表三所示: 表三 项目 A B C D E 结论 年龄 出生月份 27 出生日期 属相 鸡 星座 喜欢运动 3 ,当每一个项目都填完后就该主角铁嘴神算出场了,如何给出结论呢? 第一步,将铁嘴神算表中打勾的项记为 1 ,没打勾的项记作 0 。于是就得到一组由 0 和 1 组成的数字。比如表三中出生时期栏就能得到一组数字 11011 ;属相栏就能得到一组数字 01010 。 第二步,在表二中这组数字会对应一个数字,比如 11011 对应的数字是 27 ,如果问的是出生日期,那出生日期就是 27 号了; 01010 对应的数字是 10 ,问的是属相就还要再看表一,在表一中 10 对应的是鸡。所以是属鸡。 现在可以把结果填到表三中了,别的依此类推。 4 ,如果年龄超过 31 岁的,则用实际年龄减去 31 后用得差数来找,而你则在计算结果中再加上 31 即可。如果减了 31 还是找不到,则再减 31 ,然后再找,而你则要看对方的脸色来确定到底该加 31 还是加 62 了。 此游戏适合家有小孩的人和孩子一起玩,也适合孩子之间玩,玩过这个游戏的孩子对二进制会印象深刻,终身难忘。 玩玩二进制附件
个人分类: 智慧点滴|1091 次阅读|8 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-6-16 18:32

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部