精华内容
下载资源
问答
  • 二进制编码的方法有哪些
    千次阅读
    2021-07-16 00:57:36

    摘 要 数据是计算机处理的对象,从不同的处理角度来看,数据有不同的表现形态。从外部形式来看计算机颗处理数值、图、文字、声音、视频以及各种模拟信息量。从高级语言程员的角度来看,有数组、指针、结构、实数、整数、字符和字符串等类型数据。从算法描述的角度来看,有图、表、树、队列、矩阵等结构类型的数据。在计算机内部数据出现的任何形态最终都由机器指令来处理。从计算机指令集体系结构的角度来看,计算机中底层的机器级表示数据只有几类简单的基本数据类型,各种复杂类型的数据都由他们可以组成。

    关键词 二进制编码 计算机 处理对象

    中图分类号:TH165.3 文献标识码:A

    1关于二进制编码

    计算机内部处理的“数字化编码”是所有数据。由输入设备转化为二进制码表示的在现实生活中的感觉媒体信息,如文字、声音、活动图像、图画等,因此,“离散化”和“编码”是输入设备必须有的两个功能。因为,在计算机中用来储存、加工和传输数据的部件位数有限的,所以在计算机中只能表示和处理离散的信息。对感觉媒体信息进行定时采样,将现实世界中的连续信息转化为计算机中的离散的“样本”信息,然后对他们用“0”和“1”进行数字化编码的过程叫做“数字化编码”的过程。计算机的内部所有信息都是由二进制进行编码的。二进制表示方式在计算机内部采用。而这样做的原因有以下几点:

    (1)使用有两个稳定的物理器件就可以表示二进制数的每一位,相对于只制造两个稳定状态的物理器件要比制造有多个稳定状态的物理器容易得多。例如用高,低两个电位,或用脉冲的有无,正负极行都可以很可靠,很方便的表示“0”和“1”,所以,二进制只有两种基本状态。

    (2)二进制的编码,运算规则和计数都很简单。

    (3)逻辑命题的两个值相对应,提供了实现逻辑运算和程序中的逻辑判断的便利条件,更加方便地提供了能通过逻辑门电路方便的实现算术运算。

    2指令处理基本数据类型的分类

    可分为数值型数据和非数值型数据。

    (1)数值型数据:数值型数据可用来表示数量的多少,可比较大小,分为整数和实数,证书又分为无符号整数和带符号整数。在计算机内部,整数用定点数表示,实数用浮点数表示。

    (2)非数值型数据:非数值型数据没有大笑之分,不表示数量的多少,主要包括字符数据和逻辑数据。

    日常生活中,长使用带正负号的十进制数表示数值数据,但这种形式的数据在计算机内部难以直接存储、运算和传输。通常的十进制数仅仅是一种数值数据的输入输出形式,而不是计算机内部的表示形式,在计算机内部,数值数据的表示方法有两种:第一种是直接用二进制数表示,另一种是采用二进制编码的十进制数(Binary Coded Cecimal Number,BCD)表示。

    表示一个数值数据要确定三个要素:进位计数制、定/浮点表示和编码规则。任何给定的一个二进制0/1序列,在未确定它采用什么进位计数制、定点还是浮点表示以及编码表示方法之前,它所代表的数值的值都无法确定。

    3进位计数制的不同

    日常生活中基本上都使用十进制数,其中每个数位可用10个不同的符号0,1,2,3……9来表示,每个符号处在十进制数中不同位置时,所代表的数值是不一样的。

    在计算机系统中,常用的几种进位计数制有以下几种:

    二进制R=2,基本符号为0和1;

    八进制R=8,基本符号为0,1,2,3,4,5,6,7;

    十进制R=10,基本符号为0,1,2,3,4,5,6,7,8,9;

    十六进制R=16,基本符号为0,1,2,3,4,5,6,7,8,9.A,B,C,D,E,F。

    计算机内部所有的信息采用二进制编码表示。但在计算机外部,为了书写和阅读的方便,大都采用八、十或十六进制表示形式。因此计算机在数据输入后或输出前都必须实现这些仅为指数和二进制数之间的转换。

    4总结

    计算机内部数据的机器级表示、数据的宽度和存储排列顺序以及数据检错和纠错方法。有关数据表示主要包括:真值和机器书的概念,无符号数的表示,待符号整数的表示、浮点数的表示(包括浮点数的形式、浮点数的规格化、浮点数的表示范围、ieee 754标准),十进制数的二进制编码表示以及逻辑值、西文字符合汉子字符等非数值数据的机内表示等。

    参考文献

    [1] 焦丽丽.计算机组成与系统结构 2010.4.1版(查不到)

    [2] 赫黎明.JSP编程教程、2012.8.1(查不到)

    更多相关内容
  • 人工智能作业,使用二进制编码的遗传进化算法解决TSP问题。
  • Binary-Coding-Based Ant Colony Optimization and Its Convergence 基于二进制编码的蚁群优化算法及其收敛性
  • 计算机二进制编码

    千次阅读 2020-10-17 17:00:56
    二进制编码知识。


    从康拉德·楚泽在 Z-3 计算机中首先采用二进制计数以来,现代电子计算机都采用二进制编码。

    • 二进制是最基本的进位计数系统,只有 0 和 1,容易表达。
    • 二进制运算规则简单,可以通过逻辑和移位电路实现。

    二进制虽然表达简单,但其内容与数位却不方便识别。

    • 4 位二进制可以表示 1 位十六进制。
    • 有时会用十六进制数来替代二进制数,能够更方便识别二进制的内容与位数。
    • 必须注意:十六进制只是用于方便识别二进制数的内容与数位,计算机并不存在这些十六进制数。

    1. 整数的二进制编码

    针对数值信息(数学值)的编码,将数值本身值称作真值,将编码称为机器数。

    • 例如:将数字 8 编码为 1000,那么 8 称为真值,1000 称为机器数。
    • 计算机中定义了两种整数:无符号数和符号数。

    2. 无符号数编码

    无符号数,顾名思义是没有符号的数,编码时无需考虑符号位的编码。可以直接用真值的二进制形式作为机器数,即编码值。

    • 8 位二进制可以表达十进制中的 0 ~ 255,共 2 8 2^8 28 = 256 个数。
    • 无符号数进行计算时,如果运算结果超出取值范围,就会产生错误,这种情况称为溢出。
    • 例如:[200] + [100] = 11001000B + 01100100B = 00101100B = [44]
    • 计算结果应该为 300,超过了 8 位二进制数的取值范围 [0 ~ 255],从而得到错误的结果 44。
    • 无符号数编码的的加法/减法通过最高位的进位/借位来判断。

    3. 符号数编码

    符号数,编码时就要考虑符号编码了,不仅要表示真值的绝对值,还要表示真值的符号。
    针对符号数有四种编码方式:

    • 原码:最高位表示符号(正数用 0 表示,负数用 1 表示),其他位表示真值的绝对值。
    • 反码:正数的反码等价于原码,负数的反码就是将原码除符号位以外的其他绝对值部分按位取反。
    • 补码:正数的补码依旧等价于原码,负数的补码是将反码加1得到。
    • 移码:移码在补码的基础上增加了一个偏移量。

    3.1 原码

    早期计算机使用原码表示法,X 为真值,n 为二进制数的位数,原码定义如下:
    { [ X ] 原 = ∣ X ∣ , 0 ≤ X ≤ 2 n − 1 [ X ] 原 = 2 n − 1 + ∣ X ∣ , − 2 n − 1 ≤ X ≤ 0 \begin{cases} [X]_原=\mid X\mid,\quad\quad\quad\quad\quad\quad\quad 0\leq X \leq 2^{n-1} \\ [X]_原=2^{n-1}+\mid X \mid,\quad\quad-2^{n-1}\leq X \leq 0 \end{cases} {[X]=X,0X2n1[X]=2n1+X,2n1X0
    最高位表示符号(正数用 0 表示,负数用 1 表示),其他位表示真值的绝对值。

    • 例如 [1000 0100B],最高位符号位是 1,表示负数,绝对值部分[000 0100B] 表达 4,组合起来表达 -4。

    原码特点:

    • 乘除运算比较方便,单独处理符号与真值绝对值。
    • 加减运算比较复杂,首先处理符号,确定做加法还是减法,如果是减法,还需比较真值的大小,确定结果的符号。
    • 特殊数字 0 的原码有两个,判断是否为 0 需要分别判断 [+0] = [0000 0000B][-0] = 1000 0000B
    • 8 位二进制数可以表示 0000 0000B ~ 1111 1111B,即 -127 ~ +127,共 255 个数。

    3.2 反码

    一些老式计算机使用反码表示法,X 为真值,n 为二进制数的位数,反码定义如下:
    { [ X ] 反 = ∣ X ∣ , 0 ≤ X ≤ 2 n − 1 [ X ] 反 = 2 n − 1 − 1 − ∣ X ∣ , − 2 n − 1 ≤ X ≤ 0 \begin{cases} [X]_反=\mid X\mid,\quad\quad\quad\quad\quad\quad\quad\quad\quad 0\leq X \leq 2^{n-1} \\ [X]_反=2^{n-1}-1-\mid X \mid,\quad\quad-2^{n-1}\leq X \leq 0 \end{cases} {[X]=X,0X2n1[X]=2n11X,2n1X0
    正数的反码等价于原码, 负数的反码就是将原码除符号位以外的其他绝对值部分按位取反,故得名反码。

    • 例如:-3 的原码为[1000 0011B] ,它的反码为 [1111 1100B]

    反码特点:

    • 符号位一起参与加、减运算。
    • 加法进位需要送回到最低位再加(循环进位)。
    • 减法借位需要送回到最低位再减(循环借位)。
    • 减法可以转换为加法,简化了算数逻辑单元的设计。
    • 0 的反码也有两个,即 [0000 0000B][1000 0000B]
    • 8 位二进制数可以表示 0000 0000B ~ 1111 1111B,即 -127 ~ +127,共 255 个数。

    3.3 补码

    反码较好地解决了符号参与运算的问题,但循环进位/借位延长了计算时间,为了进一步简化,引入了补码。X 为真值,n 为二进制数的位数,补码的定义如下:
    { [ X ] 补 = ∣ X ∣ , 0 ≤ X ≤ 2 n − 1 [ X ] 补 = 2 n − 1 − ∣ X ∣ , − 2 n − 1 ≤ X ≤ 0 \begin{cases} [X]_补=\mid X\mid,\quad\quad\quad\quad\quad\quad\quad 0\leq X \leq 2^{n-1} \\ [X]_补=2^{n-1}-\mid X \mid,\quad\quad-2^{n-1}\leq X \leq 0 \end{cases} {[X]=X,0X2n1[X]=2n1X,2n1X0
    正数的补码依旧等价于原码,负数的补码是将反码加1。

    • 例如:-3 的原码是 [1000 0011B],反码为 [1111 1100B],补码为[1111 1101B]


      补码的特点:
    • 与反码一样,补码的符号位参与加/减运算,但回避了循环进位/借位。
    • 与反码一样,补码的减法运算可转化为加法运算。
    • 0的补码只有一种,即 ⌈ 00000000 B ⌋ \lceil00000000B\rfloor 00000000B,所以补码可以表示 -128~+127,其中 ⌈ 10000000 B ⌋ \lceil10000000B\rfloor 10000000B不再表示 0,而是表示 -128

    补码判断溢出使用双高异或判别法,如果最高位进位/借位与此高位进位/借位不同,则表示溢出。

    • 例如 120 + 16 时,
      0 1 1 1 1 0 0 0 B ( + 120 ) 补 + 0 0 0 1 0 0 0 0 B ( + 16 ) 补 = 1 0 0 0 1 0 0 0 B ( − 120 ) 补 \begin{array}{ccccccccc} &0&1&1&1&1&0&0&0B&(+120)_补\\ +&0&0&0&1&0&0&0&0B&(+16)_补\\ \hline =&1&0&0&0&1&0&0&0B&(-120)_补 \end{array} +=0011001001101010000000B0B0B(+120)(+16)(120)
    • 次高位产生进位,为 1 ,最高位没有产生进位,为 0, 1 ⨁ 0 = 1 1\bigoplus0=1 10=1,说明溢出。

    3.4 移码

    移码在补码的基础上增加了一个偏移量,X 为真值,n 为二进制数的位数,补码的定义如下:
    [ X ] 移 = 2 n − 1 + [ X ] 补 − 2 n − 1 ≤ X ≤ n n − 1 [X]_移=2^{n-1}+[X]_补\quad\quad -2^{n-1}\leq X \leq n^{n-1} [X]=2n1+[X]2n1Xnn1
    以 8 位二进制为例,则:.
    0 0 0 0 1 0 0 1 B ( [ + 9 ] 补 ) + 1 0 0 0 0 0 0 0 B ( 2 8 − 1 ) = 1 0 0 0 1 0 0 1 B ( [ + 9 ] 移 ) \begin{array}{cc} &0&0&0&0&1&0&0&1B&([+9]_补)\\\\ +&1&0&0&0&0&0&0&0B&(2^{8-1})\\\\ \hline\\ =&1&0&0&0&1&0&0&1B&([+9]_移) \end{array} +=0110000000001010000001B0B1B([+9])(281)([+9])
    1 0 0 0 1 0 0 1 B ( [ − 9 ] 原 ) 1 1 1 1 0 1 1 0 B ( [ − 9 ] 反 ) 1 1 1 1 0 1 1 1 B ( [ − 9 ] 补 ) + 1 0 0 0 0 0 0 0 B ( 2 8 − 1 ) = 0 1 1 1 0 1 1 1 B ( [ − 9 ] 移 ) \begin{array}{cc} &1&0&0&0&1&0&0&1B&([-9]_原) \\ &1&1&1&1&0&1&1&0B&([-9]_反) \\\\ &1&1&1&1&0&1&1&1B&([-9]_补)\\ +&1&0&0&0&0&0&0&0B&(2^{8-1})\\ \hline =&0&1&1&1&0&1&1&1B&([-9]_移) \end{array} +=111100110101101011011000001101011011B0B1B0B1B([9])([9])([9])(281)([9])


    4. 总结

    • 无符号数的编码为其二进制的表达形式。
    • 符号数的编码分为原码、反码、补码和移码。
      • 原码:最高位为符号位,取1表示负数,取0表示正数,其他位为真值的绝对值。
      • 反码:正数的反码就是原码,负数的反码为原码的符号位以外的其他位全部按位取反。
      • 补码:正数的补码就是原码,负数的补码为反码加1。
      • 移码:补码的基础上添加一个偏移量。
    • 8 位二进制的原码、反码、补码部分表:
    真值原码反码补码
    -128^^1000 0000
    -1271111 11111000 00001000 0001
    -1261111 11101000 00011000 0010
    -31000 00111111 11001111 1101
    -21000 00101111 11011111 1110
    -11000 00011111 11101111 1111
    -01000 00001111 11110000 0000
    +00000 00000000 00000000 0000
    +10000 00010000 00010000 0001
    +20000 00100000 00100000 0010
    +30000 00110000 00110000 0011
    1270111 11110111 11110111 1111
    展开全文
  • JavaScript转换二进制编码为ASCII码的方法.docx
  • 本文实例讲述了JavaScript转换二进制编码为ASCII码的方法。分享给大家供大家参考。具体如下: <html> <head> [removed] var input_id = "bin_text"; var answer_id = "answer"; function ...
  • 三位二进制普通编码器,使用三个与门组成,multisim10及以上版本可以正常打开仿真,是教材上的电路,可以直接仿真,方便大家学习。
  • 使用它通过双二进制信令技术或修改后的双二进制信令技术对位序列进行编码。 双二进制信令是一种三级信令方案,它以受控方式使用符号间干扰,而不是试图消除它。
  • 本人自己毕设实现的一个克隆选择算法的最优化程序,二进制编码实现,其中已经几个函数内嵌,可以观测到最优值和很好的效果,毕设做的辛苦的
  • 主要介绍了Python使用base64模块进行二进制数据编码详解,具有一定借鉴价值,需要的朋友可以参考下
  • 计算机组成原理--二进制编码

    千次阅读 2021-07-16 00:58:42
    算是读书笔记吧二进制编码二进制和我们平时用的十进制,其实并没有什么本质区别,只是平时我们是“逢十进一”,这里变成了“逢二进一”而已。每一位,相比于十进制下的 0~9 这十个数字,我们只能用 0 和 1 这两个...

    6b5479e6d036

    算是读书笔记吧

    二进制编码

    二进制和我们平时用的十进制,其实并没有什么本质区别,只是平时我们是“逢十进一”,这里变成了“逢二进一”而已。每一位,相比于十进制下的 0~9 这十个数字,我们只能用 0 和 1 这两个数字。

    二进制转十进制

    从右到左的第 N 位,乘上一个 2 的 N 次方

    0011 =>> 0×2³+0×2²+1×2¹+1×2⁰ = 3

    十进制转二进制

    用2做短除法

    6b5479e6d036

    因此13这个十进制数,对应的二进制数,就是 1101。

    原码表示法

    一个二进制数最左侧的一位,当成是对应的正负号,比如 0 为正数,1 为负数,这样来进行标记。

    0011 表示 +3、1011表示 -3

    但是对于0:1000 代表 0, 0000 也代表 0。

    补码表示法

    一个二进制数最左侧的一位,表示-1ⁿ

    1011 换算成十进制为:−1×2³+0×2²+1×2¹+1×2⁰=−5

    0000 表示 0,1000 在这样的情况下表示 -8。

    字符编码

    ASCII 码

    ASCII 码就好比一个字典,用 8 位二进制中的 128 个不同的数,映射到 128 个不同的字符里。

    比如,小写字母 a 在 ASCII 里面,就是第 97 个,也就是二进制的 0110 0001,对应的十六进制表示就是 61。而大写字母 A,就是第 65 个,也就是二进制的 0100 0001,对应的十六进制表示就是 41。

    在 ASCII 码里面,0-9每一个数字都对应这一个8位编码。所以很多时候我们在存储数据的时候,要采用二进制序列化这样的方式,而不是直接用CSV 或者 JSON进行存储。

    字符集(Charset)

    字符集,表示的可以是字符的一个集合

    我们日常说的 Unicode,其实就是一个字符集,包含了 150 种语言的 14 万个不同的字符。

    随着计算机的普及,越来越多的语言加入了Unicode。

    现在,他用32位,4个字节表示一个字符。

    字符编码(Character Encoding)

    类似一种传输协议,对Unicode编码后的编号进行压缩。

    Unicode本身的字符集是32位的,那么每个字符都用4个字节传输,对欧美而言,一下就要用原来ASCII码时代四倍的资源传输或者保存一样的文档。于是,出现了uft-8,utf-16,utf-32这些编码方案。

    把字符的代码通过这个编码方式映射成传输时的编码,在使用Unicode字符集保持通用性的同时节约流量和硬盘空间。

    UTF-8编码

    UFT-8编码可以保证最大限度的节约空间

    相对于Unicode这种大家固定的UTF-8的编码称之为变长码。其大受欢迎的主要原因就是对欧美而言,在保留Unicode通用性的情况下避免了流量和空间的浪费。

    用UTF-8在接收时,接到一个编码如果是合法的8位编码,就可以直接把它判定为字符,这就给了Unicode字符集在表示英语时和ASCII一样的效率。如果是不合法的,那继续读一个字节,读的两个字节16位如果是合法的,判别为一个字符,再不行继续读下去。

    为什么UTF-8成为主流

    计算机世界绝大部分传输的都是英文以及数字,编码之后UTF-16要两倍于UTF-8的空间

    为什么计算机不直接使用UTF-8进行编码

    UTF-8虽然更加节省空间,但是解析起来相对定长编码更加麻烦。

    不从头扫描一遍,你不知道第几个字符在哪个位置上,这在处理的时候非常浪费时间。

    现在很多语言/程序的处理办法,是使用源于原始UTF-16的一个定长编码,只处理字符码在16位以内的字符,不支持超过16位的罕见字。这种16位定长的编码方式被称为UCS-2。

    锟斤拷

    锟斤拷,是一串经常在搜索引擎页面和其他网站上看到的乱码字符。乱码源于GBK字符集和Unicode字符集之间的转换问题。

    `未知字符` ==(**Unicode**)==> `U+FFFD` ==(**UTF-8**)==>`\xef\xbf\xbd`

    `\xef\xbf\xbd\xef\xbf\xbd` ==(**GB2312**)==> `锟斤拷`

    GBK

    是汉字专用的字符编码方式

    GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:

    GBK、GB2312--Unicode--UTF8

    UTF8--Unicode--GBK、GB2312

    烫烫烫

    如果你用了 Visual Studio 的调试器,默认使用 MBCS 字符集。“烫”在里面是由 0xCCCC 来表示的,而 0xCC 又恰好是未初始化的内存的赋值

    定点数

    一种二进制来表示十进制的编码方式

    BCD 编码(Binary-Coded Decimal)

    我们把最右边的 2 个 0~9 的整数,当成小数部分;把左边 6 个 0~9 的整数,当成整数部分。这样,我们就可以用 32 个比特,来表示从 0 到 999999.99 这样 1 亿个实数了。

    它的运用非常广泛,最常用的是在超市、银行这样需要用小数记录金额的情况里。在超市里面,我们的小数最多也就到分。这样的表示方式,比较直观清楚,也满足了小数部分的计算。

    浮点数

    float类型

    IEEE 的标准

    它定义了两个基本的格式

    用 32 比特表示单精度的浮点数,也就是我们常常说的 float 或者 float32 类型。

    用 64 比特表示双精度的浮点数,也就是我们平时说的 double 或者 float64 类型。

    单精度float的表示

    单精度的 32 个比特可以分成三部分:

    6b5479e6d036

    符号位s

    1 个比特 -- 记做(−1)^s

    有效数位f

    23 个比特 -- 记做1.f

    指数位e

    8 个比特 -- 记做 2^(e)

    综合科学计数法,我们的浮点数就可以表示成下面这样:

    6b5479e6d036

    当然,有一些特殊的表示:

    6b5479e6d036

    举个例子:

    6b5479e6d036

    计算一个浮点数

    1. 整数部分

    与十进制相同。除以 2,然后看余数

    2. 小数部分

    乘以 2,然后看看是否超过 1。如果超过 1,我们就记下 1,并把结果减去 1,进一步循环操作。

    知道结果等于0

    比如9.1、整数位9换算成1001。

    而小数位0.1:

    6b5479e6d036

    结果是000110011…这里的“0011”会无限循环下去。所以,这也是为什么0.1无法被正确的表示为浮点数的原因。

    1001后拼接上000110011… 也就是 1001.000110011…

    进行位移之后为 1.001000110011… × 2^3

    什么样的数无法被精准的表示成浮点数

    二进制能精确地表示位数有限且分母是2^n的小数

    比如1/2、1/4、1/8

    他们在乘2的循环中,一定有一次能使结果等于1,从而推出循环。

    而且,需要在有限位数内完成循环。毕竟有效数位f只有23个比特。

    参考文献

    展开全文
  • 二进制编码八叉树的海量点云邻域快速搜索算法.pdf
  • 本文实例讲述了C#实现把图片转换成二进制以及把二进制转换成图片的方法。分享给大家供大家参考,具体如下: private void button1_Click(object sender, EventArgs e) { string path = this.textBox1.Text; byte...
  • 二进制文件编码成bytes类型,写入py文件中,作为一个变量的值。在打包py脚本时额外的资源(如图标)时,将其编码成字节码,在主程序中解码后生成原来的二进制文件,这样可以打包成一个独立的程序
  • 二进制编码-详细讲解

    千次阅读 2021-07-28 07:48:17
    负数:原码就是原来的表示方法反码是除符号位(最高位)外取反补码=反码+1以前学习二进制编码时,老师讲了一堆堆的什么原码啊反码啊补码啊xxxx转换啊,还有负数的表示方式啊 总是记不零清,终于从网上找到了一种比较好...

    负数:

    原码就是原来的表示方法

    反码是除符号位(最高位)外取反

    补码=反码+1

    以前学习二进制编码时,老师讲了一堆堆的什么原码啊反码啊补码啊xxxx转换啊,还有负数的表示方式啊 总是记不零清,终于从网上找到了一种比较好的讲解方式,保存再share一下,不过为了系统化讲解,又找来了一些编码的基础知识,如果只想看负数编码记忆法,请跳转到

    1.如果你不知道二进制怎么编码,请继续,否则请跳到2

    1字节 = 8位,所以它能表示的最大数当然是8位都是1(既然2进制的数只能是0或1,如果是我们常见的10进制,那就8位都为9,这样说,你该懂了?)

    1字节的二进制数中,最大的数:11111111。

    这个数的大小是多少呢?让我们来把它转换为十进制数。

    无论是什么进制,都是左边是高位,右边是低位。10进制是我们非常习惯的计数方式,第一位代表有几个1(即几个100),第二位代表有几个10(即几个101),第三位代表有几个100(即有几个102)…,用小学课本上的说法就是:个位上的数表示几个1,十位上的数表示向个10,百位上的数表示几个100……

    同理可证,二进制数则是:第1位数表示几个1 (20),第2位数表示几个2(21),第3位数表示几个4(22),第4位数表示向个8(23)……

    以前我们知道1个字节有8位,现在通过计算,我们又得知:1个字节可以表达的最大的数是255,也就是说表示0~255这256个数。

    那么两个字节(双字节数)呢?双字节共16位。 1111111111111111,这个数并不大,但长得有点眼晕,从现在起,我们要学会这样来表达二制数:

    1111 1111 1111 1111,即每4位隔一空格。

    双字节数最大值为:

    1 * 215 + 1 *214 + 1* 213 + 1 * 212 + 1 * 211 + 1 * 210 + …… + 1 * 22 + 1 * 21 + 1* 20 = 65535

    很自然,我们可以想到,一种数据类型允许的最大值,和它的位数有关。具体的计算方法方法是,如果它有n位,那么最大值就是:

    n位二进制数的最大值:1 * 2(n-1) + 1 * 2(n-2) + ... + 1 * 20

    2、理解有符号数和无符号数

    负数在计算机中如何表示呢?这一点,你可能听过两种不同的回答。

    一种是教科书,它会告诉你:计算机用“补码”表示负数。可是有关“补码”的概念一说就得一节课,这一些我们需要在第6章中用一章的篇幅讲2进制的一切。再 者,用“补码”表示负数,其实一种公式,公式的作用在于告诉你,想得问题的答案,应该如何计算。却并没有告诉你为什么用这个公式就可以和答案? -----我就是被这个弄混淆的>_<

    另一种是一些程序员告诉你的:用二进制数的最高位表示符号,最高位是0,表示正数,最高位是1,表示负数。这种说法本身没错,可是如果没有下文,那么它就是错的。至少它不能解释,为什么字符类型的-1用二进制表示是“1111 1111”(16进制为FF);而不是我们更能理解的“1000 0001”。(为什么说后者更好理解呢?因为既然说最高位是1时表示负数,那1000 0001不是正好是-1吗?-----re!当初偶就是这么想的,so一直在脑中打架,越打越混淆=,=)。

    让我们从头说起。

    2.1、你自已决定是否需要有正负。

    就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我们必须自已决定某个量是否需要正负。如果这个量不会有负值,那么我们可以定它为带正负的类型。

    在计算机中,可以区分正负的类型,称为有符类型,无正负的类型(只有正值),称为无符类型。

    数值类型分为整型或实型,其中整型又分为无符类型或有符类型,而实型则只有符类型。

    字符类型也分为有符和无符类型。

    比如有两个量,年龄和库存,我们可以定前者为无符的字符类型,后者定为有符的整数类型。

    2、使用二制数中的最高位表示正负。

    首先得知道最高位是哪一位?1个字节的类型,如字符类型,最高位是第7位,2个字节的数,最高位是第15位,4个字节的数,最高位是第31位。不同长度的数值类型,其最高位也就不同,但总是最左边的那位(如下示意)。字符类型固定是1个字节,所以最高位总是第7位。

    (红色为最高位)

    单字节数: 1111 1111

    双字节数: 1111 1111 1111 1111

    四字节数: 1111 1111 1111 1111 1111 1111 1111 1111

    当我们指定一个数量是无符号类型时,那么其最高位的1或0,和其它位一样,用来表示该数的大小。

    当我们指定一个数量是有符号类型时,此时,最高数称为“符号位”。为1时,表示该数为负值,为0时表示为正值。

    3、无符号数和有符号数的范围区别。

    无符号数中,所有的位都用于直接表示该值的大小。有符号数中最高位用于表示正负,所以,当为正值时,该数的最大值就会变小。我们举一个字节的数值对比:

    无符号数: 1111 1111   值:255 1* 27 + 1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20

    有符号数: 0111 1111   值:127         1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20

    同样是一个字节,无符号数的最大值是255,而有符号数的最大值是127。原因是有符号数中的最高位被挪去表示符号了。并且,我们知道,最高位的权值也是最高的(对于1字节数来说是2的7次方=128),所以仅仅少于一位,最大值一下子减半。

    不过,有符号数的长处是它可以表示负数。因此,虽然它的在最大值缩水了,却在负值的方向出现了伸展。我们仍一个字节的数值对比:

    无符号数:                       0 ----------------- 255

    有符号数:        -128 --------- 0 ---------- 127

    同样是一个字节,无符号的最小值是 0 ,而有符号数的最小值是-128。所以二者能表达的不同的数值的个数都一样是256个。只不过前者表达的是0到255这256个数,后者表达的是-128到+127这256个数。

    一个有符号的数据类型的最小值是如何计算出来的呢?

    有符号的数据类型的最大值的计算方法完全和无符号一样,只不过它少了一个最高位(见第3点)。但在负值范围内,数值的计算方法不能直接使用1* 26 + 1* 25 的公式进行转换。在计算机中,负数除为最高位为1以外,还采用补码形式进行表达。所以在计算其值前,需要对补码进行还原。这里,先直观地看一眼补码的形式:

    以我们原有的数学经验,在10进制中:1 表示正1,而加上负号:-1 表示和1相对的负值。

    那么,我们会很容易认为在2进制中(1个字节): 0000 0001 表示正1,则高位为1后:1000 0001应该表示-1。

    然而,事实上计算机中的规定有些相反,请看下表:

    二进制值(1字节)

    十进制值

    1000 0000红色的1代表负数蓝色的是补码(补码=反码+1)

    -128

    1000 0001蓝色部分代表多大的值?:将补码还原为原码

    -127想化成负数?:先减去1再按位取反

    1000 0010还原方法:补码-1再取反

    -126

    1000 0011

    -125

    ...

    ...

    1111 1110

    -2

    1111 1111

    -1

    首先我们看到,从-1到-128,其二进制的最高位都是1(表中标为红色),正如我们前面的学。

    然后我们有些奇怪地发现,1000 0000 并没有拿来表示 -0;而1000 0001也不是拿来直观地表示-1。事实上,-1 用1111 1111来表示。

    怎么理解这个问题呢?先得问一句是-1大还是-128大?

    当然是 -1 大。-1是最大的负整数。以此对应,计算机中无论是字符类型,或者是整数类型,也无论这个整数是几个字节。它都用全1来表示 -1。比如一个字节的数值中:1111 1111表示-1,那么,1111 1111 - 1 是什么呢?和现实中的计算结果完全一致。1111 1111 - 1 = 1111 1110,而1111 1110就是-2。这样一直减下去,当减到只剩最高位用于表示符号的1以外,其它低位全为0时,就是最小的负值了,在一字节中,最小的负值是1000 0000,也就是-128。

    我们以-1为例,来看看不同字节数的整数中,如何表达-1这个数:

    字节数

    二进制值

    十进制值

    单字节数

    1111 1111红色表示负数蓝色部分的补码为值1

    -1

    负数:原码就是原来的表示方法、反码是除符号位(最高位)外取反、补码=反码+1双字节数

    1111 1111 1111 1111

    -1

    四字节数

    1111 1111 1111 1111 1111 1111 1111 1111

    -1

    可能有同学这时会混了:为什么 1111 1111 有时表示255,有时又表示-1?所以我再强调一下本节前面所说的第2点:你自已决定一个数是有符号还是无符号的。写程序时,指定一个量是有符号的,那么 当这个量的二进制各位上都是1时,它表示的数就是-1;相反,如果事选声明这个量是无符号的,此时它表示的就是该量允许的最大值,对于一个字节的数来说, 最大值就是255。

    展开全文
  • 关于遗传算法的一个二进制编码的计算函数最大值的实例
  • 遗传算法的python实现(二进制编码),适用于python3.x环境,详细的注释和两个给出的测试函数。
  • 本文实例讲述了C#解码base64编码二进制数据的方法。分享给大家供大家参考。具体如下: 通过在Convert类的静态方法Convert.FromBase64String,可以讲base64编码的字符串解码为等效的byte []数组。 using System; ...
  • 主要介绍了C#对二进制数据进行base64编码方法,涉及C#中Convert.ToBase64String用法技巧,需要的朋友可以参考下
  • 遗传算法采用二进制编码.zip
  • 整数的二进制编码
  • 浮点数的二进制编码
  • 香农代码的matlab 香农二进制编码matlab 使用MATLAB的Shannon编码过程查找二进制源代码的效率和冗余
  • 用matlab编写的经典二进制编码遗传算法算例,求函数最大值并画图,附带注释。
  • c语言实现8位二进制编码转化成10进制、16进制、ACSLL码,用于解析蓝牙透传中所传输的信号。供各位参考学习。
  • 对输入的二进制序列编码转换为:HDB3码
  • 在读入时,文件的每行是二进制串,形如: b'heroes\xff..... 在对每行进一步进行处理时,要求处理对象必须为通用字符串,所以: lineVec = str(line).strip().split('\t') 此时的lineVec的元素类型为string,但输出...
  • 霍夫曼二进制编码

    2014-12-01 19:22:56
    霍夫曼二进制编码

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 481,429
精华内容 192,571
热门标签
关键字:

二进制编码的方法有哪些