zoukankan      html  css  js  c++  java
  • 408计组 |二、数据的表示和运算

    [一 数制和编码](#一 数制和编码)

    [二 定点数](#二 定点数)


    一 数制和编码

    1.数制相互转换

    2.BCD码

    3.字符与字符串

    4.校验码

    • 奇偶校验
    • 海明码
    • 循环冗余校验码

    1.数制相互转换

    image-20210927232208387


    1.1 r进制到十进制

    image-20210927232246629

    1.2 二进制到八进制、十六进制

    image-20210927232316649

    1.3 十进制到r进制

    image-20210927232401029

    2.BCD码

    image-20210927232423771

    3.字符与字符串

    image-20210927232449905

    3.1 字母存储

    image-20210927232516763

    3.2 汉字存储

    image-20210927232520468

    4.校验码

    4.校验码

    4.1 奇偶校验

    image-20210926202003212

    4.2 海明码

    4.2.1 求解步骤

    (1)确定校验码位数

    • (2^kge n+k+1(n+k种出错,1种正确))
    • n个信息位;k个校验位,校验码有(2^k)种状态;

    (2)确定校验码位置

    • (P_i)放在(2^{i-1})的位置上,其余按顺序

    • 信息位(D_4D_3D_2D_1(1010)),校验位(P_3P_2P_1),海明码为(H_7H_6H_5H_4H_3H_2H_1)

      image-20210926194702444

    (3)求校验位的值

    • (H_i)位置(i)算出对应的二进制码

    • 从右到左按列(h)观察,选出所有为1的(H_i)。找出(H_i)对应的信息位(D_j),对所有(D_j)进行异或运算,则可得出对应的(P_h)

      image-20210926195352566

    (4)纠错

    • 对校验方程进行计算

    • 若出现偶校验错误,将结果(S_3S_2S_1)转为十进制,对应位置即为错误位置

      image-20210926201504716

    4.2.2 检错与纠错

    • 检错能力:2;纠错能力:1

    • 全体校验

      当两个跳变时,无法根据对应的位置确定它就是出错位。即上面无法区别是1位错还是2位错。所以引入全校验位,在最后面加上(P_全),该值是由原始数据得出偶校验码。

      现在对传输的数据进行一次全体偶校验进行分析

      image-20210926203551403

    4.3 循环冗余校验码

    CRC。数据发送、接受方约定一个“除数”,保证余数为0


    4.3.1 求CRC码

    (1)确定长度与二进制码

    • 信息码长度K;
    • 校验码R=生成多项式最高次幂或(二进制码位数-1);
    • 校验码位数N=K+R
    • 二进制码:生成多项式的系数

    (2)由模2除法求CRC码

    • 信息码低位补R个0(右侧)
    • 模2除法
      • 被除数:信息位+R个0

      • 除数:二进制码

      • 除的时候看被除数的最高位作为商,减的时候用异或运算。

      • 余数比被除数少一位,余数结果为校验位

        image-20210928201812636

    • CRC码:信息位+校验位

    4.3.2 检错与纠错

    • 示例

      image-20210926211814247

    • 检错:

      可检测出所有奇数个错误;

      可检测出所有双比特的错误;

      可检测出所有小于等于校验位长度的连续错误;

    • 纠错:

      K个信息位,R个校验位,若生成多项式选择得当,且 (2^Rge K+R+1),CRC码可纠正1位错。

    二 定点数

    1.定点数的表示

    2.定点数运算

    • 补码作用
    • [移位运算](#2.2 移位运算)
    • [加减运算](#2.3 加减运算)
    • [乘法运算](#2.3 乘法运算)
    • [除法运算](#2.4 除法运算)

    1.定点数的表示

    image-20210927215422366

    表示范围

    类型 范围
    无符号数(n) (0sim2^n-1)
    原码/反码整数(n+1) (-(2^n-1)le xle 2^n-1)
    原码/反码小数(n+1) (-(1-2^{-n})le xle 1-2^{-n})
    补码/移码整数(n+1) (-2^nle xle2^n-1\比原码多表示一个-2^n)
    补码小数(n+1) (-1le xle1-2^-n\比原码多一个-1)

    2.定点数运算

    2.1 补码作用

    减法换加法,减少硬件成本(ALU无需集成减法器)


    (x=qm+r\x~mod~12=r\q为整数,r为余数,m为模。即要在r相等的情况下找到x)

    • 模余数相同的数是同一类,等价。即可知-3和9在模12的条件下是等价的。
    • 互为补数:两个数的绝对值=模。减去一个数即加上这个数的补数。也就是(10+(-3))可转换成(10+9)再取模。
    • 而计算机是以(2^8(1,00000000))为模的,a的补数=模-|a|=全部取反再+1

    image-20210927150727185

    2.2 移位运算

    image-20210927215546058

    2.2.1 算数移位

    image-20210927153015895


    补码的算数移位

    • 正数和原码一致

    • 由于负数补码=反码末位+1。所以反码最右边连续的1会因进位变成0,直到第一个0。故负数补码最右边的1及其右边与原码一致。而其左边与反码一致。所以造成了:

      • 右移(同反码):高位补1,低位舍弃。
      • 左移(同原码):低位补0,高位舍弃。

    image-20210927152929678


    加法举例

    image-20210927153138008

    2.2.2 逻辑移位

    RGB值例子:例如用3B储存102、139、133

    102的二进制数储存进去并向左移动16位

    139的二进制数储存进去并向左移动8位

    133的二进制数储存进去

    相加得3B的RGB值

    2.2.3 循环移位

    image-20210927153644315

    2.3 加减运算

    image-20210928213154745

    2.3.1 溢出判断

    image-20210927221346287


    • 方法一:一位符号位

      [V=ABoverline{S}+overline{AB}S\加数的符号位为:A、B;结果的符号位S:\乘法表示与,加法表示或 ]

    • 方法二:一位符号位,根据进位情况判断

      [V=C_1oplus C_s\ 结果的最高数值位的进位:C_1;\符号位的进位:C_s; ]

    • 方法三:双符号位

      [V=S_{s1}oplus S_{s2}\正数符号位:00;负数符号位11;\结果的两个符号位分别是S_{s1}S_{s2} ]

      ==>V=0无溢出;V=1溢出

    2.3 乘法运算

    chen


    图示

    • 原码一位乘法
    • 补码一位乘法中MQ新增了红色部分(辅助位),为保持一致ACC、X也加了一位,变成双符号位。

    image-20210928172803913


    运算过程

    • 原码一位乘法

    • 补码一位乘法

    2.4 除法运算


    2.4.1 思想

    确定商:若被除数大于除数,确定1,否则0;补零继续算

    2.4.2 恢复余数法(原码)

    ACC 被除数、余数
    MQ
    X 除数
    • 由于计算机不会比较被除数与除数的大小,所以会默认上商1。它根据(被除数-除数/余数-除数/ACC-X)的结果的符号位判断商1或是商0,若结果是负数,则说明被除数小于除数,即商1是错的,此时需要变成商0,且回复余数。

    • (被除数-除数=(ACC)-[|y|]=(ACC)+[-|y|]_补)。更具体的转换过程:

      • 先将原码(y)变成([y]_补)

        若y为正,([y]_补)与原码一致

        若y为负,([y]_补)为原码的符号位不变,后面取反

      • 再将([y]_补)变为([-y]_补)

        ([y]_补)全部取反再,末位+1

    • 若上面结果是负数-->恢复余数:((ACC)+除数=(ACC)+[|y|]_补),商变回0,再计算

    • 每次计算完逻辑左移,低位补0。机器字长有几位就求几位的商

    • 余数=结果*(2^n)(n=机器字长-符号位,左移n次 上商n+1次)

    • 示例:

      设机器字长为5位(含1位符号位,n=4),x=0.1011,y=0.1101,采用原码恢复余数法求x/y。(|x|=0.1011,|y|=0.1101,[|y|]_补=0.1101,[|-y|]_补=1.0011)

      image-20210928214326169

    2.4.2 加减交替法(原码)

    也称不恢复余数。原理:若余数为负,直接商0。余数不恢复,而是:

    (新余数=余数左移1位+|除数|~(左移1位即乘以2))


    过程

    2.4.3 加减交替法(补码)

    3.强制类型转换

    C语言中以补码的形式存储

    有符号数与无符号数:不改变数据内容,只改变解释方式(符号位被当做数值位)

    void main(){
        //有符号数:short,占2字节;
        //无符号数:unsigned
        short x=-4321;//[x]原=1001000011100001;[x]补=1110111100011111
        unsigned short y=(unsigned short)x//y=1110111100011111,真值61215
    }
    

    长整数变短整数:高位截短,保留低位

    void main(){
        //int:占4字节
        int a=-165537,b=-34991;//a:0x000286a1	b:0xffff7751
        short c=(short)a,d=(short)b//c:0x68a1(-31071)	d:0X7751(30545)
    }
    

    短整数变长整数:符号扩展

    void main(){
        //负数补1,正数补0
        short x=-4321;
        int m=x;//前面补1
        unsigned short n=(unsigned short)x;//变成了无符号数
        unsigned int p=n;//前面补0
    }
    

  • 相关阅读:
    341. Flatten Nested List Iterator
    667. Beautiful Arrangement II
    953. Verifying an Alien Dictionary
    1704. Determine if String Halves Are Alike
    MySQL数据库的数据类型详解【转】
    Dart之数组(List)的相关方法总结【转】
    Flutter解决点击非输入框时关闭键盘问题及TextFormField焦点切换问题【转】
    Flutter Switch开关【转】
    Image Picker
    Flutter按钮添加背景图片及文字【转】
  • 原文地址:https://www.cnblogs.com/sanhuamao/p/15346032.html
Copyright © 2011-2022 走看看