科学网

 找回密码
  注册

tag 标签: 二进制

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

[转载]为什么计算机用补码存储数据
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
个人分类: 镜子大全|3585 次阅读|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 )。真要适应它,恐怕不是一时半会儿。不过,据说搞科学的人很喜欢它。这里有一个 在线的二进制时间 。 上面这张示意图可以帮助你理解如何看懂这个钟上的时间。原来它还不是一个完全的二进制表达。不过, 完全二进制的钟表 也已经面世。不过,人们可能更难看懂时间了。
个人分类: 够数学|6758 次阅读|0 个评论
从两个游戏谈信息量
武际可 2010-6-24 10:44
文章可能不太清晰,上传一个pdf文档: 从两个游戏谈信息量.pdf
个人分类: 科普|4632 次阅读|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期 连超牛大科学家都觉得学《周易》有必要,比如莱布尼茨、比如量子力学?何况一般的官员? 萧萐父先生谓:今天的易之三义:神道易、科学易、人文易!
个人分类: 冷眼热心|10079 次阅读|2 个评论
人生与二进制数据
yhc511025 2010-4-23 15:32
今天看到一本书,谈到人生的选择,突然想起计算机里面的二进制也是一种选择。于是想了想这两者之间的联系。 计算机里面的二进制数据有两个重要的参数,一个是位数,另一个是每一位对应的值。人的一生简单说来也有两个重要的参数,一个是机遇的次数,另一个是面临每次机遇所做的选择。 计算机二进制数的位数不能确定,但是每一位都面临着两个值可选,要么是 0 ,要么是 1 ,将选择的每一位连接起来,便成了一个计算机二进制数。而人一生面临机遇的次数也不确定,但是面临机遇时的选项也只有两个,做或不做,将每次面临机遇时所作的选择连接起来,也就构成了人生的过程,这个过程也可以像计算机内的数据一样用二进制编码来表示。 上面只是简单的将人生和计算机数字世界联系起来。随着科技的发展,也许某一天真能实现真实世界和虚拟世界的无缝链接!
个人分类: 生活点滴|2659 次阅读|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 这总是能够做到的。 于是我们得到结论如下:如果甲轮到取火柴时,三个数的二进制数位和的每一位都是偶数,则他无论怎样取火柴,都会使数位和至少一位变为奇数。乙总可以适当取火柴使数位和恢复偶数。因为最后全取光时的数位和是偶数。所以甲是输定了的。如果甲轮到取火柴时,三个数的数位和,不全是偶数。我们说按照第二步的策略,甲肯定能够取得胜利。即最后一根火柴肯定是他取的。 这样分析后,这个残局对先走的人必胜策略就是很容易实现的了。 博弈论告诉我们,任何胜负分明没有和局的游戏,总存在对某一方必胜的策略。我们这个残局和对应的取火柴的游戏正是如此。而且数的二进制在这个残局和取火柴游戏的取胜策略中也得到巧妙的应用。
个人分类: 科普|8632 次阅读|13 个评论
二进制算数与先天图
gl6866 2009-6-11 18:36
近几十年来学术界讨论的一个非常热门的话题就是:德国大哲学家、数学家莱布尼茨的“二进制算数”当时叫做“二进制级数”,即逢二进一的计数方法与邵雍先天图的关系。参加这场讨论的有西方包括英国科学史家李约瑟博士在内的,以及国内许多著名的科学史与中国哲学史的专家学者。但是他们讨论的焦点大致集中在两点:首先,邵雍的先天图卦序是否就是二进制的记数方法?或是一种“无意识的巧合”而符合二进制的记数方法关系?其次,莱布尼茨发明二进制算数是否受了邵雍先天图的启发?主流的学术观点认为邵雍的先天图不是二进制记数方法,或至少不是一种自觉运用的二进制的记数方法;莱布尼茨在其发明二进制之前并未看到邵雍的先天图。 对于主流学术观点,国外早已有了相应的评论,也就是说,莱布尼茨肯定是先看到了先天图,然后才有了自己的工作。但是我的问题是,邵雍的先天图是否就是一种目前我们所谓的“二进制计数”的方法呢?我的回答则是否定的。它与当前与我们用的计算机的二进制算数没有任何关系。因此,在我看来,无论是主流的和非主流的观点似乎都未说到要害之处。现在,我还是要从另外一个角度探讨一下这个问题。看邵雍的先天图如何能与二进位制计数联系起来。 《周礼·春官》曰:“大卜掌三易之法;一曰《连山》,二曰《归藏》,三曰《周易》。其经卦皆八,其别卦皆六十有四。”这里所说的《连山易》、《归藏易》,其书在汉初亡佚,现无据可考,难度其详。从此,《连山》与《归藏》成为中华文化领域里的一件千古之谜。目前所见到《周易》是经过孔子的增删分和所成。孔子对于《周易》的修订,的一个关键点就是将读卦的顺序从坤卦始而变革为从乾卦始。这就是《周易》中的后天图。可是,孔子的改变卦序的做法,从此决定了中国数千年男尊女卑的地位。而据信在殷商流行的《连山》与《归藏》,则是坤卦始,从某种意义上反映出母系社会的痕迹。 而宋代邵雍的先天图在我国易学领域引起的是另一场革命。其革命对象便是针对文王后天图而来的。邵雍的先天图无论八卦还是六十四卦,其卦序顺读都是始于《乾》而终于《坤》,我们的绝大多数学者都按顺读的方法来读它,我特别强调是绝大多数学者都是按照先前那个后天图的卦序来读邵雍的先天图卦序的,这就无法理解到邵雍革命的妙道所在。因而,也就很难发现其中所蕴涵的二进制的记数方法。可是邵雍在其《皇极经世书》(卷十三)指出:“夫易之数,由逆而成矣。”他告诉我们考察先天图的易数关系的要诀是“逆数”,其中包括卦序的“逆数”和爻序的“逆数”。卦序的“逆数”是从《坤》卦至《乾》卦,中国素有“顺则人、逆则仙” 的说法。而邵雍的先天图的卦序都遵循着这样一种逻辑法则,被称为“加一倍法”。所谓“加一倍法”即是今天严格意义上的“二进制”的记数方法。朱熹称其为 “加一位法”,那么,今天我们便可以不再根据传统的卦画的方式来重新表述先天图,而是改变符号,根据当前流行的阿拉伯数字重新制作出一张以0和1为基础的自然数表,从而使其与当代计算机的基本处理方式联系起来。 正如大科学家爱因斯坦曾经指出的那样:“事物的这种真理必须一次又一次地为强有力的性格的人物重新加以刻勒,而且总是使之适用于雕塑家为之工作的那个时代的需要;如果这种真理不总是不断地重新创造出来,它就会完全被我们遗忘掉。”
个人分类: 学术论文|6633 次阅读|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卦,其排列顺序都不唯一时,我们就更有理由否定《周易》中有二进制思想的结论了。在二进 制与《周易》的关联方面,我们最多可以说《易经》的八卦中无意识巧合碰上的东西,被莱布尼兹有意识地发现了(李约瑟语)。 不过,我们也可以换一种角度来看一下这个问题。即把《周易》看作一种具有开放性的经典文本,后人可以对它做出不同的解释。在这种解释学立场下,我们 就没必要否认莱布尼兹用二进制解释邵雍易图的合理性,也没有必要反对《周易》中蕴含着二进制的说法了。作为对经典的一种解读方式,把两者联在一起是有道理 的,可以看作是对经典的一种创造性的发挥。只是,我们必须要严格区分开这种新的解读方式与古人原意之间的差距,注意不要把后人在新视角下看到的东西非要安 到古人身上,并美其名曰:弘扬中华民族古代智慧。可以说,不合情理地往我们古人脸上涂金的做法如果不是出于无知,那么只能是出自于一种过度的民族自卑。
个人分类: 转载精品|10604 次阅读|0 个评论
《周易》、二进制和计算机 -(转载)
chrujun 2009-4-19 22:37
《周易》、二进制和计算机 作者:王乃信   大家知道,在电子计算机中,信息、指令、状态都是用 二进制 数表示的,运算、处理也是用 二进制 数进行的。随着计算机的普及, 二进制 愈来愈成为人们津津乐道的话题。   在数学史上, 二进制 数系是和德国伟大的数学家Leibniz(1646-1716)的名字联系在一起的。现在流行着一种时髦的说法,说 二进制 来源于中国,因为《周易》中早已有了 二进制 。还有人进一步发挥说,既然 二进制 来源于中国,那么,计算机的老祖宗也应该在中国。某大报在头版头条论述所谓留给二十一世纪的悬念的文章中就说,Leibniz受《周易》启发,发明了 二进制 和计算机。 易经中六十四卦的排列次序,即所谓乾、坤、屯、蒙、需、讼、师、比等,是很混乱的。在考古发现的易经古本中,六十四卦的排列次序就完全不同,但也同样是很混乱的。这些排列次序均与 二进制 无关。易传中的序卦是专门解释六十四卦的排列次序的,但多为牵强附会之同,连自圆其说都谈不上,根本没有 二进制 的影子。易经将六十四卦划分为三十二对,其中占大多数的二十八对,其相对两卦的六爻是彼此上下颠倒的,这与 二进制 毫无共同之处。易传说:易有太极,是生两仪,两仪生四象,四象生八卦。这似乎是《周易》中与 二进制 有关的话。但这实际上只是一种原始的一分为二的思想,与 二进制 仍然没有必然的联系。易传在讲述八经卦时,分八经卦为阴阳两类:乾、震、坎、艮,交画为三,为五,为奇致,故称阳卦;坤、巽、离、兑,爻画为六、为四,为偶数,故称阴卦。这种划分与太极、两仪、四象、八卦的一分为二思想格格不入,这里的所谓的奇偶与 二进制 数的奇偶也是风马牛不相及的。归根结底,《周易》中是找不到 二进制 思想的。   不可否认,邵雍所创造的六十四卦图确实有朴素的 二进制 思 想。邵雍是一个素养较高的理学家,他有许多值得称赞的创造。他发展易传中太极、两仪、四象、八卦的一分为二思想,并将其贯彻始终。他按照这种思想,重新排 列出八经卦的次序:乾、兑、离、震、巽、坎、艮、坤,进而依次重之,排列出六十四卦的次序。邵雍以伏羲的名义,画出了所谓伏羲八卦次序图、伏羲八卦方位 图。伏羲六十四卦次序图、伏羲六十四卦方位图。这是《周易》中原来没有的崭新的图,也就是 Leibniz所看到的图。因此,Leibniz对伏羲以及文王、周公、孔子的赞叹确系张冠李戴。邵雍还画过所谓天地始终之数图,以及许多其他的图,并引 入辰、日、月、岁、世、运、会、元等时间单位,交替用十 二进制 和三十进制,构成一个复杂而规律的计数系统。但是,我们不得不指出,邵雍虽然提出并交替使用了十 二进制 和三十进制,却从来没有以任何方式提出或暗示过 二进制 计数法。肯定地说,邵雍在他的六十四卦图中所蕴涵的 二进制 思想是不自觉的。邵雍所关心的是如何在他的宇宙模式下把万事万物纳入数的范畴,因而,他不可能在数学上再前进一步。   还必须指出, 二进制 的产生与计算机的产生并没有必然的联系。1794年,Leibniz设计并制造了人类有史以来的第一台能进行四则运算的机械计算机。尽管:Leibniz早在十五年前就建立了完整的 二进制 数系及其运算规则,但他的机械计算机仍然用的是十进制。另外,如果把不同数位上的不同数字视为不同状态,那么表示某一范围的数时,不同进位制所需的状态数各不相同,从而有优劣之分,其中 二进制 并不是最优的,三进制才是最优的。从计数和运算的角度看,各种进制并无区别。电子计算机采用 二进制 ,是因为 二进制 运算规则简单,并且容易在物理上实现。由此看来,即使邵雍确实为《周易》注入了朴素的 二进制 思想,我们也是无法把《周易》与计算机直接联系起来的。 转自:http://www.stonerain.net 陨石站 4f4    我们的祖先创造了灿烂的古代科学文化,这当然是应该引以自豪的。但是,我们也不得不承认,由于我们的固步自封,欧洲文艺复兴以后,我们的科学文化就一步 一步、愈来愈远地落在列强之后,这正是我国近代史上屈辱、挨打的重要原因之一。我们要汲取血的历史教训,决不可重蹈覆辙。对于祖先创造的古代科学文化我们 要实事求是地取其精华,弃其糟粕,继承之,改造之,发展之,切不可夜郎自大,沾沾自喜,躺在遗产上睡大觉,切不可盲目地以为我们的祖先把一切道理都说清 了,切不可自欺欺人地把现代科学的成就硬归功于我们的祖先。科学文化的发展是有其规律的,违背它,或者超越它都是错误的。我们不能苛求我们的祖先。在宣传 我国古代灿烂的科学文化时,一定要尊重历史,切不可随心所欲地说过了头。因为,即使是真理,如果说过了头,也会变成谬误。
个人分类: 转载精品|8880 次阅读|0 个评论
莱布尼茨与易学的数理派
gl6866 2009-3-7 22:04
按:这是几年前我为两岸三地在安徽开会时准备的一篇论文的摘要。但是由于身体原因,我没有去成。然而,我的思路已经形成,这篇文章还是要继续做下去的。现在将它发在博克上,让大家讨论一下我的思路,同时也能启迪我的进一步的思考。 从信息哲学的角度看易学的数理派 莱布尼茨、白晋、五来欣造、刘百闵等关于易学的研究与传播 易学研究在我国素有象数和义理两派,致力于对其哲学意义的阐发。然而,自从宋儒邵雍创作先天图,始创易学的先天之学,朱熹继承了邵氏学说,提出了先天学研究纲领,为易学的数理研究奠定了基础。随着易经在17世纪传播到欧洲时,莱布尼茨在与法国在中国的耶稣会士白晋的通信中获悉邵雍的若干六十四卦排列严整的卦图,并对该图做了二进制的解释。从而在西方首创易学的数理研究而终成大气候。上个世纪初叶日本学者五来欣造在法国求学时,见到欧洲17世纪对儒学的研究,专门来到汉诺威莱布尼茨档案馆研究了莱布尼茨-白晋的通信,并写成专著《儒教对德国政治思想之研究》,其中以很大篇幅谈论了莱布尼茨关于先天图的研究,首次发掘出莱布尼茨所见到的先天易图。但不幸五来关于莱布尼茨易图研究在日本几乎没有影响,原因在于科学史家及易经专家对此不感兴趣,而政治学者则对二进制不感兴趣。后来由台湾学者刘百闵将其中专讲莱布尼茨关于周易学的部分译成中文发表,引起中国学者的注意。到了上个世纪初,莱布尼茨的符号逻辑研究却成为数理逻辑的先声,其基本思想就是将传统逻辑推理转换成演算,而到了本世纪初,国际计算与哲学协会(IACAP)则将莱布尼茨的这一思想视为其事实起点,创立了信息哲学这门以逻辑的变易性为基础的新兴的哲学学科。从某种意义说,中国的易学为西方学术改造做出了支持和论证,如何将在国外兴起的易学数理派与我国传统的学术资源对接起来,无疑为我们提出了崭新的启示和课题。
个人分类: 人物记事|5279 次阅读|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-5-24 00:24

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部