精华内容
下载资源
问答
  • 二进制

    2018-10-12 10:29:08
    二进制数是以2位基数记数系统表示的数字,通常用在数字电路中二进制数据是用0和1来表示的数据。基数位2,进位规则位“逢二进一”。数字电子电路中,逻辑门的实现直接应用了二进制,因此现代的计算机和依赖计算机的...

    二进制数是以2位基数记数系统表示的数字,通常用在数字电路中二进制数据是用0和1来表示的数据。基数位2,进位规则位“逢二进一”。数字电子电路中,逻辑门的实现直接应用了二进制,因此现代的计算机和依赖计算机的设备里都用到二进制。每一个二进制数称为一个bit或一个位元.
    计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。

    进制之间的转换:
    十进制数转换为二进制数、八进制数、十六进制数的方法:
    二进制数、八进制数、十六进制数转换为十进制数的方法:按权展开求和法

    (1)二进制转十进制
    方法:“按权展开求和”
    【例】:
    规律:个位上的数字的次数是0,十位上的数字的次数是1,......,依次递增,而十
    分位的数字的次数是-1,百分位上数字的次数是-2,......,依次递减。
    注意:不是任何一个十进制小数都能转换成有限位的二进制数。
    (2)十进制转二进制
    · 十进制整数转二进制数:“除以2取余,逆序排列”(除二取余法)
    【例】:
    89÷2 ……1
    44÷2 ……0
    22÷2 ……0
    11÷2 ……1
    5÷2 ……1
    2÷2 ……0
    1
    · 十进制小数转二进制数:“乘以2取整,顺序排列”(乘2取整法)
    【例】: (0.625)10= (0.101)2
    0.625X2=1.25 ……1
    0.25 X2=0.50 ……0
    0.50 X2=1.00 ……1
    十进制1至128的二进制表示:
    0=0
    1=1
    2=10
    3=11
    4=100
    5=101
    6=110
    7=111
    8=1000
    9=1001
    10=1010
    11=1011
    12=1100
    13=1101
    14=1110
    15=1111
    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
    32=100000
    33=100001
    34=100010
    35=100011
    36=100100
    37=100101
    38=100110
    39=100111
    40=101000
    41=101001
    42=101010
    43=101011
    44=101100
    45=101101
    46=101110
    47=101111
    48=110000
    49=110001
    50=110010
    51=110011
    52=110100
    53=110101
    54=110110
    55=110111
    56=111000
    57=111001
    58=111010
    59=111011
    60=111100
    61=111101
    62=111110
    63=111111
    64=1000000
    65=1000001
    66=1000010
    67=1000011
    68=1000100
    69=1000101
    70=1000110
    71=1000111
    72=1001000
    73=1001001
    74=1001010
    75=1001011
    76=1001100
    77=1001101
    78=1001110
    79=1001111
    80=1010000
    81=1010001
    82=1010010
    83=1010011
    84=1010100
    85=1010101
    86=1010110
    87=1010111
    88=1011000
    89=1011001
    90=1011010
    91=1011011
    92=1011100
    93=1011101
    94=1011110
    95=1011111
    96=1100000
    97=1100001
    98=1100010
    99=1100011
    100=1100100
    101=1100101
    102=1100110
    103=1100111
    104=1101000
    105=1101001
    106=1101010
    107=1101011
    108=1101100
    109=1101101
    110=1101110
    111=1101111
    112=1110000
    113=1110001
    114=1110010
    115=1110011
    116=1110100
    117=1110101
    118=1110110
    119=1110111
    120=1111000
    121=1111001
    122=1111010
    123=1111011
    124=1111100
    125=1111101
    126=1111110
    127=1111111
    128=10000000
    与八进制
    二进制数转换成八进制数:从小数点开始,整数部分向左、小数部分向右,每3位为一组用一位八进制数的数字表示,不足3位的要用“0”补足3位,就得到一个八进制数。
    八进制数转换成二进制数:把每一个八进制数转换成3位的二进制数,就得到一个二进制数。
    八进制数字与十进制数字对应关系如下:
    000 -> 0 | 004-> 4 | 010=8
    001 -> 1 |005 -> 5| 011=9
    002 -> 2 |006 -> 6 | 012=10
    003 -> 3 |007 -> 7 | 013=11
    【例】:将八进制的37.416转换成二进制数:
    3 7 . 4 1 6
    011 111 .100 001 110
    即:(37.416)8 =(11111.10000111)2
    【例】:将二进制的10110.0011 转换成八进制:
    0 1 0 1 1 0 . 0 0 1 1 0 0
    2 6 . 1 4
    即:(10110.0011)2 = (26.14)8
    与十六进制
    二进制数转换成十六进制数:二进制数转换成十六进制数时,只要从小数点位置开始,向左或向右每四位二进制划分一组(不足四位数可补0),然后写出每一组二进制数所对应的十六进制数码即可。
    十六进制数转换成二进制数:把每一个十六进制数转换成4位的二进制数,就得到一个二进制数。
    十六进制数字与二进制数字的对应关系如下:
    0000 -> 0 0100 -> 4 1000 -> 8 1100 -> C
    0001 -> 1 0101 -> 5 1001 -> 9 1101 -> D
    0010 -> 2 0110 -> 6 1010 -> A 1110 -> E
    0011 -> 3 0111 -> 7 1011 -> B 1111 -> F
    【例】:将十六进制数5DF.9 转换成二进制:
    5 D F . 9
    0101 1101 1111 .1001
    即:(5DF.9)16 =(10111011111.1001)2{十六进制怎么会有小数点}
    【例】:将二进制数1100001.111 转换成十六进制:
    0110 0001 . 1110
    6 1 . E
    即:(1100001.111)2 =(61.E)16

    转载于:https://blog.51cto.com/13917831/2299098

    展开全文
  • 什么是二进制文件

    2019-12-28 22:10:42
    包含在ASCII及扩展 ASCII字符中编写的数据或程序...计算机文件基本上分为二种:二进制文件和 ASCII(也称纯文本文件),图形文件及文字处理程序等计算机程序都属于二进制文件。这些文件含有特殊的格式及计算机代码...

    转自:https://baike.baidu.com/item/%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%96%87%E4%BB%B6/996661


    包含在 ASCII及扩展 ASCII 字符中编写的数据或程序指令的文件。计算机文件基本上分为二种:二进制文件和 ASCII(也称纯文本文件),图形文件及文字处理程序等计算机程序都属于二进制文件。这些文件含有特殊的格式及计算机代码。ASCII 则是可以用任何文字处理程序阅读的简单文本文件。

    中文名

    二进制文件

    外文名

    BINary files

    外国语缩写

    BIN(作文件扩展名

    目录

    1. 定义
    2. 使用二进制文件的好处
    1. 二进制文件的储存方式
    2. 如何使用语句操作二进制文件
    1. 用例

    定义

    广义的二进制文件即指文件,由文件在外部设备的存放形式为二进制而得名。狭义的二进制文件即除文本文件以外的文件。文本文件是一种由很多行字符构成的计算机文件。文本文件存在于计算机系统中,通常在文本文件最后一行放置文件结束标志。文本文件的编码基于字符定长,译码相对要容易一些;二进制文件编码是变长的,灵活利用率要高,而译码要难一些,不同的二进制文件译码方式是不同的。

    从本质上来说他们之间没有什么区别,因为他们在硬盘上都有一种的存放方式--二进制,但是如果要对他们有些区分的话,那可以这样理解。每个字符由一个或多个字节组成,每个字节都是用的-128—127之间的部分数值来表示的,也就是说,-128——127之间还有一些数据没有对应任何字符的任何字节。如果一个文件中的每个字节的内容都是可以表示成字符的数据,我们就可以称这个文件为文本文件,可见,文本文件只是二进制文件中的一种特例,为了与文本文件相区别,人们又把除了文本文件以外的文件称为二进制文件,由于很难严格区分文本文件和二进制文件的概念,所以我们可以简单地认为,如果一个文件专门用于存储文本字符的数据,没有包含字符以外的其他数据,我们就称之为文本文件,除此之外的文件就是二进制文件。

    使用二进制文件的好处

    为什么要使用二进制文件。原因大概有三个:
      第一是二进制文件比较节约空间,这两者储存字符型数据时并没有差别。但是在储存数字,特别是实型数字时,二进制更节省空间,比如储存 Real*4 的数据:3.1415927,文本文件需要 9 个字节,分别储存:3 . 1 4 1 5 9 2 7 这 9 个 ASCII 值,而二进制文件只需要 4 个字节(DB 0F 49 40)
      第二个原因是,内存中参加计算的数据都是用二进制无格式储存起来的,因此,使用二进制储存到文件就更快捷。如果储存为文本文件,则需要一个转换的过程。在数据量很大的时候,两者就会有明显的速度差别了。
      第三,就是一些比较精确的数据,使用二进制储存不会造成有效位的丢失。 [1] 

    二进制文件的储存方式

    列举一个二进制文件如下:

    00000000h:0F 01 00 00 0F 03 00 00 12 53 21 45 58 62 35 34; .........S!EXb54

    00000010h:41 42 43 44 45 46 47 48 49 47 4B 4C 4D 4E 4F 50; ABCDEFGHIGKLMNOP

    这里列出的是在 UltraEdit(UE) 里看到的东西。其实只有红色部分是文件内容。前面的是 UE 加入的行号。后面的是 UE 尝试解释为字符型的参考。
      这个文件一共有 32 字节长。显示为两列,每列 16 个字节。实际上,这仅仅是 UE 的显示而已。真实的文件并不分行。仅仅知道这个文件的内容,如果我们没有任何说明的话,是不能看出任何有用信息的。
      下面我规定一下说明:我们认为,前 4 个字节是一个 4 字节的整型数据(0F 01 00 00 十六进制:10Fh 十进制:271)。这 4 个字节之后的 4 个字节是另一个 4 字节的整型数据(0F 03 00 00 十六进制:30Fh 十进制:783)。其后的 4 个字节(12 53 21 45 )表示一个 4 字节的实型数据:2.5811919E+3。再其后的 4 个字节(58 62 35 34)表示另一个 4 字节的实行数据:1.6892716E-7。而只后的 16 个字节(41 42 43 44 45 46 47 48 49 47 4B 4C 4D 4E 4F 50)我们认为是 16 个字节的字符串(ABCDEFGHIGKLMNOP)
      实际上,二进制文件只是储存数据,并不写明数据类型,比如上面的第 9 字节到第 16 字节(12 53 21 45 58 62 35 34),我们刚才认为是 2 个 4 字节的实型,其实也可以认为是 8 个字节的字符型( S!EXb54)。而后面的 16 个字节的字符串(ABCDEFGHIGKLMNOP),我们也可以认为是 2 个 8 字节的整型,或者 4 个 4 字节的整型,甚至 2 个 8 字节的实型,4 个 4 字节的实型,等等等等。
      因此,面对一个二进制文件,我们不能准确地知道它的含义,我们需要他的数据储存方式的说明。这个说明告诉我们第几个字节到第几个字节是什么类型的数据,储存的数据是什么含义。否则的话,我们只能猜测,或者无能为力。 [1] 

    如何使用语句操作二进制文件

    我们将上面的那个二进制文件保存为:TestBin.Bin 来举例。
      读取和写入二进制其实是两个很类似的操作,了解了其中之一,另一个也就不难了。

    二进制文件我们通常使用直接读取方式,Open 语句可以写为:

    引用

    Open( 12 , File = 'TestBin.Bin' , Access = 'Direct' , Form = 'Unformatted' , RecL = 4 )

    上面的 Access 表示直接读取方式,Form 表示无格式储存。比较重要的是 RecL 。我们读取数据时,是用记录来描述单位的,每一次读入或写入是一个记录。记录的长度在 Open 时就确定下来,以后不能改变。如果需要改变,只能 Close 以后再此 Open。
      记录长度在某些编译器下表示读取的 4 字节长度的倍数,规定为 4 表示记录长度为 16 字节。有些编译器下就直接表示记录的字节数,规定为 4 则表示记录长度为 4 字节。这个问题需要参考编译器手册。在 VF 系列里,这个值是前面一个含义。可以通过设置工程属性的 Fortran,Data,Use Bytes as RECL= Unit for Unformatted Files 来改变,使之成为后一个含义。在命令行模式下,则使用 /assume:byterecl 这个编译选项。
      确定 RecL 大小是我们需要做的事情,一般来说,不适合太大,也不适合太小。还需要结合数据储存方式来考虑。太小的话,我们需要执行读写的次数就多,太大的话,我们就不方便操作小范围的数据。
      有时候我们甚至会分多次来读取数据,每一次的 RecL 都不同。对于上面的 TestBin.Bin 文件来说,它比较简单,我以 16 字节长度和 8 字节长度两种读取方式来演示,你甚至可以一次 32 个字节长度全部读完。 [1] 

    用例

    C++程序语言学习过程中常见名词,相对于Binary file的是Text file(纯文本文件)。

    C++中二进制文件读写函数:

    fread

    fwrite

    ifstream.read()

    ofstream.write()

    文件读

    文件写


      

     

    展开全文
  • 本文原文来自 《二进制的认识和Java中对二进制的使用》。 本文的讲解及代码部分都是针对Java语言,可能对其它语言并不适用,但介于这部分内容较底层,因此可酌情参考。 一、认识二进制 二进制,是计算技术中广泛采用...

    重要声明:本文章仅仅代表了作者个人对此观点的理解和表述。读者请查阅时持自己的意见进行讨论。

    本文原文来自 《二进制的认识和Java中对二进制的使用》

    本文的讲解及代码部分都是针对Java语言,可能对其它语言并不适用,但介于这部分内容较底层,因此可酌情参考。

    一、认识二进制

    二进制,是计算技术中广泛采用的一种数制,由德国数理哲学大师莱布尼茨于1679年发明。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。摘自百度百科

    二、位 - bit

    计算机能保存的最小数据单位:位(bit),常常也叫:比特。一个位保存的数据,要么是0,要么是1

    由于一个位的数据存储量太少,因此大多数情况下都是几个位组成多个来使用。下面就是常见的基本类型定义:

    • byte: 由8个位组成。
    • short: 由16个位组成
    • char: 由16个位组成
    • int: 由32个位组成
    • float: 由32个位组成
    • long: 由64个位组成
    • double: 由64个位组成

    同时 byteshortintlong (即整数)在保存数据时,高位表示符号位,用1表示负数,用0表示正数。所谓最高位,就是从左数的第一位。当表示负数时,实际值要对所有位取反然后加1。比如:

    使用byte作为案例,因为只有8位,篇幅占用少。
    
    00000010: 表示整数 2
    11111110: 表示整数 -2。
              取值过程:
              第一步:观察最高位是1,因此取反,得:00000001
              第二步:取反后加1,得:00000010
              得出结果:2,取负得:-2。
    
    为了直观观察,常常每4位写一个空格:
    0000 0010 = 2
    1111 1110 = -2
    

    1、二进制转十进制

    二进制十分不便于阅读,而十进制是从小就接触到的。所以,将二进制数据转换为十进制经常用到各种场合。甚至大多数情况下,都是将数据转换为十进制进行使用。

    先从简单开始,首先来说说十进制:

    十进制的基数是:0, 1, 2, 3, 4, 5, 6, 7, 8, 9
    当我们数数时,数到第十时,由于基数里没有一个数字可以直接表示十这个数,所以产生了进位,到第九时,若要继续数下去,那么就进一位,从而变成:10。使用了基数 1 和基数 0 组合起来,形成 10。
    
    同样的道理,二进制的基数是:0, 1
    当我们数数时,数到二时,由于基数里没有一个数可以直接表示二这个数,所以也要进位。那么进一位后就形成了:10。
    
    那么,不妨来多罗列几个数字,形成直观的感受:
    二进制   十进制
       1  ==   1
      10  ==   2
      11  ==   3
     100  ==   4
     101  ==   5
     110  ==   6
     111  ==   7
    1000  ==   8
    1001  ==   9
    1010  ==  10
    1011  ==  11
    1100  ==  12
    1101  ==  13
    1110  ==  14
    1111  ==  15
    

    数字简单的话,可以通过一个一个的数数,直接反应出结果,但如果有一个很长的二进制数,用数数的方法显然也没法快速完成了,我们必须使用一套计算方法来完成这个工作了,先来看一张图:

    图1

    按照图上的公式,计算出接过来,就可以得到十进制的结果了。

    2、十进制转二进制

    有了上面一小节的知识后,就很容易理解各进制间的关系了。那么从十进制转换为二进制又该如何转换呢,这节知识应该在高中时就有所学习了:

    图2

    使用图上的计算方式,每次除以2,然后取余数,最终商为0时停止计算,上图中:215的二进制表示为:11010111。

    三、字节 - byte

    一个字节由8个位组成,因此他能容纳的整数范围也就被框定在了:[-128, 127] 之间,为什么在这个范围之间?不妨看看下面的推理过程:

    一个byte占8位,而最高位0表示正数,1表示负数。
    因此不难得出最小值:1000 0000, 最大值:0111 1111
    
    最小值:1000 0000。将实际值计算出来:
    1、最高位是1,为负数,先取反得:0111 1111;
    2、再加1得:1000 0000;
    3、使用上面的公式计算:1x(2^7)+0x(2^6)+...+0x(2^0) = 128
    4、由于最高位是1,表示负数,得到最终结果:-128
    
    最大值:0111 1111。将实际值计算出来:
    1、直接使用公式计算:1x(2^6)+1x(2^5)+...+1x(2^0) = 127
    2、由于最高位是0,直接确定最终结果:127
    
    所以为什么byte的容量只能在: [-128, 127] 子间,这就是原因所在了。
    

    阅读了上面的推导过程,细心的朋友不难发现,当最大值再进行加1操作过后,其结果在二进制层面上立刻就变成了最小值,再反应到十进制输出时,就直接成了: 127 + 1 = -128 这样的非常规结果了。主要原因就在于,byte最大值就是127,而再进行加1,最高位就变成了1,立刻就发生了质的变法,从正数变成了负数,还不小心成了byte里最小的负数。(实际上127+1赋值给byte是会报错的,但如果你把128通过强制转换成byte,则会出现此问题。)

    四、短整型 - short

    在实际编程过程中,并不经常用到它,可能比较重要的一个原因就是它能容纳的数据不大。但即便是不大,它也比字节(byte)多占用1倍的空间。短整型占用了 16 个位,也就相当于 2 个字节的容量。因此不难得到它的最大最小范围:1000 0000 0000 0000 ~ 0111 1111 1111 1111,写出十进制值则是:
    -32768 ~ 32767。计算过程可以按照上一节的方式计算出来。

    五、整型 - int

    整型是实际编程过程中最常用的基本类型之一,它由 32 个位组成,显然能存储的数字就更大。它的取值范围是:-2147483648 ~ 2147483647‬ 。 这个容量对于大多数场景来说,都已经适用了。

    六、长整型 - long

    长整型的数据存储容量又是整型的2倍,它由 64 个位组成。取值范围是:-9223372036854775808 ~ 9223372036854775807

    七、浮点

    浮点类型的数据可以支持小数点在内,这样一来就为程序里支持小数点提供了解决方案。不过它不是精确表示的,意味着在有时候得到的结果可能并不是一个精确的数字。java针对浮点类型数在内存里的保存方式是遵循了 IEEE 754标准 的。因此,要了解浮点数是如何保存的,只需要了解这个标准是如何制定的就知道了。同时下面也会对其做详细的介绍。

    1、十进制小数与二进制的互换

    在开始了解浮点数前,有必要先了解一下十进制小数是怎么和二进制进行转换的。对于十进制小数的转换为二进制,需要分为两部分处理,整数部分和小数部分。

    1)、十进制->二进制

    例如我将:24.13 转换为二进制。

    整数部分

    整数部分也就是小数点左边部分,是:24。可以直接使用上边几节的知识将其进行转化为二进制,为节省篇幅,此处直接得出结果:11000

    小数部分

    小数部分也就是小数点右边部分,是:0.13。我们知道,整数部分转换为二进制是使用除法取余,最终倒序取结果的方式。而针对小数部分,就不是这样计算的了,甚至计算方式相反,要进行乘法运算了。小数部分转化二进制,常常采用乘2取整的方法。就是将小数部分乘以2,得到的结果取其整数部分。例如将0.13转化为二进制:

    // 只对小数部分乘2取整。
    0.13 × 2 = 0.26 -> 取整数部分得:0 ,下次计算只使用小数部分:0.26
    0.26 × 2 = 0.52 -> 取整数部分得:0 ,下次计算只使用小数部分:0.52
    0.52 × 2 = 1.04 -> 取整数部分得:1 ,下次计算只使用小数部分:0.04
    0.04 × 2 = 0.08 -> 取整数部分得:0 ,下次计算只使用小数部分:0.08
    0.08 × 2 = 0.16 -> 取整数部分得:0 ,下次计算只使用小数部分:0.16
    0.16 × 2 = 0.32 -> 取整数部分得:0 ,下次计算只使用小数部分:0.32
    0.32 × 2 = 0.64 -> 取整数部分得:0 ,下次计算只使用小数部分:0.64
    0.64 × 2 = 1.28 -> 取整数部分得:1 ,下次计算只使用小数部分:0.28
    0.28 × 2 = 0.56 -> 取整数部分得:0 ,下次计算只使用小数部分:0.56
    0.56 × 2 = 1.12 -> 取整数部分得:1 ,下次计算只使用小数部分:0.12
    0.12 × 2 = 0.24 -> 取整数部分得:0 ,下次计算只使用小数部分:0.24
    0.24 × 2 = 0.48 -> 取整数部分得:0 ,下次计算只使用小数部分:0.48
    0.48 × 2 = 0.96 -> 取整数部分得:0 ,下次计算只使用小数部分:0.96
    0.96 × 2 = 1.92 -> 取整数部分得:1 ,下次计算只使用小数部分:0.92
    0.92 × 2 = 1.84 -> 取整数部分得:1 ,下次计算只使用小数部分:0.84
    0.84 × 2 = 1.68 -> 取整数部分得:1 ,下次计算只使用小数部分:0.68
    0.68 × 2 = 1.36 -> 取整数部分得:1 ,下次计算只使用小数部分:0.36
    0.36 × 2 = 0.72 -> 取整数部分得:0 ,下次计算只使用小数部分:0.72
    0.72 × 2 = 1.44 -> 取整数部分得:1 ,下次计算只使用小数部分:0.44
    0.44 × 2 = 0.88 -> 取整数部分得:0 ,下次计算只使用小数部分:0.88
    0.88 × 2 = 1.76 -> 取整数部分得:1 ,下次计算只使用小数部分:0.76
    0.76 × 2 = 1.52 -> 取整数部分得:1 ,下次计算只使用小数部分:0.52
    0.52 × 2 = ....... 发现又一次出现0.52,这和第4行的产生了重复,继续乘下去也会一直这样下去,这里就产生了二进制上的循环。
    
    那么此时,可得到小数(为了显示清晰,在循环部分我使用空格分开):
    0.13 转化为二进制为:00 10000101000111101011 10000101000111101011....循环
    

    拿到了小数部分的二进制结果,再加上整数部分的二进制结果就得到了:

    24.13 = 11000.00 10000101000111101011 10000101000111101011....循环
    
    2)、二进制->十进制

    在上边的讲解 位(bit) 的小节阐述了如何将二进制数据直接转化为十进制,你可以使用同样的方法将带小数的二进制数据代入公式进行计算。就拿上边得到的结果来进行运算

    整数部分

    整数部分十分简单,可直接套入公式:

    11000 = 1×(2^4)+1×(2^3)+0×(2^2)+0×(2^1)+0×(2^0) = 24
    

    小数部分

    或许你会对小数部分感到迷惑,实际上知道真相的你眼泪会掉下来。在上面整数计算过程中,其指数部分由高到低分别降低: 4-3-2-1-0,而小数部分,可以继续降低,然后使用同样的方法:

    00 10000101000111101011 10000101000111101011....循环 = 0×(2^-1)+0×(2^-2)+1×(2^-3)+0×(2^-4)+0×(2^-5)+0×(2^-6)+0×(2^-7)+1×(2^-8)++0×(2^-9)+1×(2^-10)+0×(2^-11).... ≈0.13
    

    最终整数部分加上小数部分的结果,即可顺利得到最终结果:

    11000.00 10000101000111101011....循环 = 1×(2^4)+1×(2^3)+0×(2^2)+0×(2^1)+0×(2^0)+0×(2^-1)+0×(2^-2)+1×(2^-3)+0×(2^-4)+0×(2^-5)+0×(2^-6)+0×(2^-7)+1×(2^-8)++0×(2^-9)+1×(2^-10)+0×(2^-11).... ≈ 24.13
    

    从这样一个计算过程,也不难发现,在处理小数的保存时,精度问题也逐渐的暴露了出来。

    2、单精度浮点 - float

    单精度浮点数占用32个位空间,它和整型(int)占用相同数量的空间。但它的取值范围计算方式和整型(int)的取值范围计算方式大不一样。由于浮点数在计算机中的保存方式和整型的保存方式不一样,从而导致了它们的取值范围不一样。java对浮点数的保存方式遵循了 IEEE 754标准 标准。在了解单精度浮点的范围之前,不妨先来一窥 IEEE 754标准 的真面目。

    IEEE 754 标准

    IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denormal number)),一些特殊数值(无穷(Inf)与非数值(NaN)),以及这些数值的“浮点数运算符”;它也指明了四种数值舍入规则和五种例外状况(包括例外发生的时机与处理方式)。了解更多

    标准什么的看起来可能会比较难以理解,不如先看一下这张图来入个门吧:

    图1

    符号位

    只占用第一个位,这个很容易理解,它的作用就是确定这个数是负数还是正数。这个整数类型首位符号位是一个意思。

    指数部分

    占用了接下来的8个位,这部分保存了指数部分的值,需先将十进制小数转化为二进制小数,然后转化成二进制科学计数法的小数,然后将其指数部分加上偏移(127)再保存到指数部分。例如:

    比如我们将小数 13.625 的指数部分要保存的值求出来:
    第一步 - 先化十进制小数为二进制,根据上面的知识,很容易得到:1101.101
    第二步 - 化二进制结果为科学计数法。
          要注意这个过程有个规定:化为科学计数法时必须要保证小数点左边只有一个数并且这个数只能是1。
          因此这里我们只需要将 1101.101 向右移动(即小数点向左)3个位置,就可得到结果:1.101101 × 2^3
    第三步 - 将指数实际值加上偏移127。得:3 + 127 = 130
    第四步 - 计算 130 的二进制结果,按照上面的知识即可技术得到结果:1000 0010
    
    最终,我们拿到小数 13.625 的指数部分要保存到计算机的结果:1000 0010
    

    底数部分

    这部分占用了剩下的所有23个位。它负责保存底数部分,就比如上面的推导过程中,二进制科学计数法时,其数据的底数就是 1.101101,而规定了小数点左边只能是1,因此保存时只保存小数点右边部分 101101,这个数据量还没有达到 23 个,可在后面补0直到23个。例如:

    接上一部分推导。我们已经拿到了 13.625 的二进制科学计数表示结果:1.101101 × 2^3
    第一步 - 取底数:1.101101
    第二部 - 左边始终为1,只需保存小数点右边部分:101101
    第三步 - 不足23位,补0。
    最终得到底数部分要保存的值:101101 000000 000000 00000
    

    最后,再结合符号位指数部分底数部分,将小数 13.625 保存到计算机的完整结果:

    小数:13.625
    入计算机:0 10000010 10110100000000000000000
    

    3、单精度浮点 - float - 取值范围

    那么有了这些了解之后,就很容易得出单精度浮点数的最小值和最大值了 1 11111111 11111111111111111111111 ~ 0 11111111 11111111111111111111111。现在不妨来计算一下它们的十进制值:

    先计算最小值:1 11111111 11111111111111111111111
    第一步 - 确定正负。观察首位是1,表示负数。
    第二步 - 计算指数。指数位: 11111111
          将二进制数:11111111 转化为十进制得:255
          由于存入时的指数是加了偏移127的,因此取出时要减去,得: 255-127 = 128
    第三步 - 计算底数。底数为:11111111111111111111111
          由于底数存储是使用的小数点右边部分,因此取出是要加上原本左边的[1.]。
          得到结果:1.11111111111111111111111
    第四步 - 拼接为科学二进制计数法。
          将底数和指数结合,得:1.11111111111111111111111 × 2^(128)
    第五步 - 转为二进制常规计数法。
          得到:1 11111111111111111111111 00...00 (除第一个1外,有23个1。共104个0)
    第六步 - 将此二进制数计算为十进制。
          1×(2^127) + 1×(2^126) + ... + 1×(2^104) + 0×(2^103) + ... + 0×(2^0)
          = 340282346638528859811704183484516925440
    第七步 - 取负值。应为原始二进制数据首位是1,因此取负值。
    最终得到 float 最小值为:-340282346638528859811704183484516925440
    
    针对最大值的计算,其实计算方式相同。只是首位正负不同而已。
    那么最终可得到float的十进制取值范围:
    -340282346638528859811704183484516925440 ~ 340282346638528859811704183484516925440
    

    4、双精度浮点 - double

    双精度浮点占用了 64 个位,它与单精度浮点数在数据存入计算机时是使用相同的原理。只是数据量大小的区别。区别如下:

    区域 单精度(float) 双精度(double)
    符号位 占1位 占1位
    指数位 占8位 占11位
    指数位偏移值 127 1023
    底数位 23位 52位

    八、字符 - char

    字符(char)占用了16个位,它在内存中实际上保存的是字符对应的ASCII码值,而该值就是一个整型数据,因此其存储逻辑和整型数据是一致的,只是在读取时,会根据ASCII码表进行对应转换。常见的ASCII字符码值如下:

    字符 码值 字符 码值 字符 码值
    0 \t 9 \n 10
    \r 13 空格 32
    ! 33 " 34 # 35
    $ 36 % 37 & 38
    39 ( 40 ) 41
    * 42 + 43 , 44
    - 45 . 46 / 47
    0 48 1 49 2 50
    3 51 4 52 5 53
    6 54 7 55 8 56
    9 57 : 58 ; 59
    < 60 = 61 > 62
    ? 63 @ 64 A 65
    B 66 C 67 D 68
    E 69 F 70 G 71
    H 72 I 73 J 74
    K 75 L 76 M 77
    N 78 O 79 P 80
    Q 81 R 82 S 83
    T 84 U 85 V 86
    W 87 X 88 Y 89
    Z 90 [ 91 |92
    ] 93 ^ 94 _ 95
    ` 96 a 97 b 98
    c 99 d 100 e 101
    f 102 g 103 h 104
    i 105 j 106 k 107
    l 108 m 109 n 110
    o 111 p 112 q 113
    r 114 s 115 t 116
    u 117 v 118 w 119
    x 120 y 121 z 122
    { 123 | 124 } 125
    ~ 126

    你可以使用这段代码把所有字符打印出来:

    for (char i = 0; i < Character.MAX_VALUE; i++) {
        System.out.println(i + ":" + (short)i);
    }
    
    展开全文
  • C语言:二进制相加输出二进制

    千次阅读 2019-11-19 21:42:50
    二进制相加输出二进制 给定两个二进制字符串,返回他们的和(用二进制表示)。 输入为非空字符串且只包含数字 1 和 0。 示例 1: 输入: a = “11”, b = “1” 输出: “100” 示例 2: 输入: a = “1010”, b =...

    二进制相加输出二进制

    给定两个二进制字符串,返回他们的和(用二进制表示)。

    输入为非空字符串且只包含数字 1 和 0。

    示例 1:

    输入: a = “11”, b = “1”
    输出: “100”

    示例 2:

    输入: a = “1010”, b = “1011”
    输出: “10101”

    #include<stdio.h>
    #include<string.h>
    main()
    {
    	char a[101],b[101];
    	int m,n,i,j,k;
    	scanf("%s",a);
    	scanf("%s",b);
    	m=strlen(a);
    	k=n=strlen(b);
    	if(m>k) k=m;
    	a[k+1]=0;
    	for(i=0;i<k;i++)
    	    a[k-i]=a[m-i-1];
    	for(i=0;i<=k-m;i++)
    	    a[i]='0';
    	for(i=0;i<=k;i++)
    	    b[k-i]=b[n-i-1];
    	for(i=0;i<=k-n;i++)
    	    b[i]='0';
    	j=0;
    	for(i=0;i<k;i++)
    	{
    		j=(a[k-i]+b[k-i]+j-96);
    		a[k-i]=j%2+48;
    		j=j/2;
    	}
    	a[0]=j+48;
    	if(a[0]=='0')
    	    printf("%s\n",a+1);
    	else
    	    printf("%s\n",a);
    }
    展开全文
  • 字符编码是现实世界的文字与...字符编码以数字的形式呈现,最终又将数字转化会二进制二进制是数据的一种表示形式。例如:十进制表示满十进一,八进制表示满八进一,同理二进制则为满二进一。 十进制:0 1 2 3 ...
  • 二进制、八进制、十进制、十六进制关系及转换

    万次阅读 多人点赞 2019-02-21 21:20:22
    二进制,八进制,十进制,十六进制之间的关系是什么?浮点数是什么回事? 本文内容参考自王达老师的《深入理解计算机网络》一书&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;中国水利水电出版社&amp;amp;amp;amp...
  • 十进制与二进制数的相互转换,可以通过移位操作和取倒每一位数操作两种方法......
  • Python3 字符串、数字、二进制互相转换

    万次阅读 多人点赞 2019-01-29 11:10:26
    二进制 0b11 结果 3 八进制 0o77 结果 63 16进制 0xFF 结果 255 字符串 &lt;class 'str'&gt; 纯字符串 'str' "str" '''str''' """str""" 字符串数字(二进制 ...
  • 二进制求和

    千次阅读 2019-01-10 15:07:48
    给定两个二进制字符串,返回他们的和(用二进制表示)。 输入为非空字符串且只包含数字 1 和 0。 示例 1: 输入: a = “11”, b = “1” 输出: “100” 示例 2: 输入: a = “1010”, b = “1011” 输出: “10101” ...
  • 数字逻辑练习题 时间限制: 1 Sec 内存限制: 128 ...原码是符号位为 1,数值部分取绝对值的二进制。  反码是符号位为 1,其它位是原码取反。  补码是符号位为 1,其它位是原码取反,未位加 1。    输入一个 64bit 十
  • 顺序0~9首先被用来表示字符(null)/没有任何书写笔画的空着的‘空’字符到(tab)/制表跳格键符,数学的数字0~9被顺延至序号为48~57位置,所以数字0在ascii的序号即位置为48,而48二进制数值为110000,同理,数字2...
  • 8421BCD码是一种最常见的二-十进制编码,用四位二进制码0000~1001代表十进制的0~9,它与十进制码的转换十分简单,只需将需要转化的数字改写为对应的二/十进制码即可。 例:(12)10=(00010010)BCD    &...
  • 二进制 Symbol 十进制 十六进制 二进制 Symbol 0 00 0000 0000 NUL 64 40 0100 0000 @ 1 01 0000 0001 SOH 65 41 0100 0001 A 2 02 0...
  • 在计算机中常用到十进制数、二进制数、八进制数、十六进制数等,下面就这几种在计算机中常用的数制来介绍一下.1.十进制数我们平时数数采用的是十进制数,这种数据是由十个不同的数字0、1、2、3、4、5、6、7、8、9任意...
  • 二进制文件和非二进制文件

    千次阅读 2012-09-17 14:34:53
    二进制文件和非二进制文件   1. 流式文件:文件中的数据是一串字符,没有结构。 2. 文本文件是一种典型的顺序文件,其文件的逻辑结构又属于流式文件。特别的是,文本文件是指以ASCII码方式(也称文本方式)存储...
  • 1.7 二进制文件

    2018-12-26 22:30:00
    二进制文件 所需工具 二进制编码表 使用汇编生成二进制文件 二进制文件分析 二进制文件 所需工具 所需工具 操作系统:Linux : Ubuntu18:http://releases.ubuntu.com/18.04/ 文本编...
  • python文件二进制加密

    千次阅读 2018-04-19 09:26:04
    简介:简单的文本文件加密:输入待加密文件和n,将文件转成二进制文件,对原始文件为n的整数倍的字节处将二进制数据取反进行加密,解码时再对这些二进制取反,中间储存过程都是二进制文件,达到简单的加密效果。...
  • 二进制搜索法 java 介绍 (Introduction) In this tutorial, we are going to learn about the Binary Search algorithm and implement it in Java. 在本教程中,我们将学习二进制搜索算法并在Java中实现它。 Normal...
  • 如果你是搞网络的,我觉得你一定要记住以下几种二进制数的转换值。你是一个网络工程 师,当看到一串二进制数时,你不要告诉我你会拿出笔纸或掰手指算半天才知道它转化成十进制的数值。要想快,那就记下下面几种常见...
  • 二进制运算

    千次阅读 2019-03-10 16:27:06
    1.十进制转化为二进制(编译器为32进制) #include&amp;amp;lt;iostream&amp;amp;gt; using namespace std; int main() { int m,number ,s[32]; cin&amp;amp;gt;&amp;amp;gt;number; for...
  • 二进制字符串转化为十进制数字

    万次阅读 2013-01-29 11:59:41
    今天在进行二进制字符串转化为十进制数字的时候,感觉明明是在范围内却报异常了,很是奇怪。百度了一下 java里面,这条语句Integer.parseInt("80000000",16)怎么抛出NumberFormatException? ...
  • 计算机为什么要用二进制

    万次阅读 2019-06-14 08:27:29
    00 前言熟悉编程的人都知道二进制总是一个让人晦涩难懂的词汇,只有大神级的程序员才有资格把玩它。 我们今天来重新认识一下二进制,了解编程中的数学知识和计算机为什么使...
  • 26个字母的二进制代码 :第一列: 二进制;第二列:十进制;第三列:十六进制;第四列:字母大写字母:01000001 65 41 A01000010 66 42 B01000011 67 43 C01000100 68 44 D01000101 69 45 E01000110 70 46 F01000111 71 47 G...
  • 满意答案inside933112013.04.02采纳率:48%等级:11已帮助:11308人二进制数转换为十进制数二进制数第0位的权值是2的0次方,第1位的权值是2的1次方……所以,设有一个二进制数:0110 0100,转换为10进制为:用横式...
  • 本文目錄進制介紹二进制转十进制八进制转十进制十六进制转十进制十进制转二进制十进制转八进制十进制转十六进制二进制转八进制二进制转十六进制八进制转二进制十六进制转二进制 進制介紹 对于整数,有四种表示方式:...
  • 二进制:  1,二进制是以0和1为码,逢2进1,比如3=11=1*2+1。  2,在计算机当中其它进制的算法基本基于2进制,因为计算机只认识0和1,比如16进制数则意味着一位16进制码由4位2进制码数表示。  3,在Java...
  • 在计算机应用中,二进制使用后缀b表示;十进制使用后缀d表示,十六制使用后缀H表示。 二.二进制,十六进制与十进制的计算转换 1.二进制转换为十进制 计算公式:二进制数据X位数字乘以2的X-1次方的积的总和 例:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 93,199
精华内容 37,279
关键字:

二进制48是什么字