一文掌握计算机必备基础之数据表示及运算(上)

470 阅读7分钟

前言:一文掌握计算机必备基础之数据表示及运算(上)

1 进制运算的基础知识

1.1 进制运算的基础

1.1.1进制概述

  • 进制的定义

如 n = 10[0-9] 称为十进制(通过 0-9 这十个符号表示无限的数值)

  • 常见的几种进制
    • 二进制

        1. 二进制数据是用 0 和 1 两个数码来表示的数。它的基数为 2,进位规则是“逢二进一”,借位规则是“借一当二”。
        1. 当前的计算机系统使用的基本上是二进制系统,计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。
    • 八进制

        1. Octal, 缩写 OCT 或 O , 一种以 8 为基数的计数法, 采用0,1,2,3,4,5,6,7八个数字,逢八进1。
        1. 八进制的数和二进制数可以按位对应(八进制一位对应二进制三位),因此常应用在计算机语言中。
    • 十进制

      1. 全世界通用的一种进制,古代世界中最先进、科学的记数法
      2. 满十进一,满二十进二,以此类推……
      3. 按权展开,第一位权为10^0,第二位10^1……以此类推,第N位10^(N-1),该数的数值等于每位的数值*该位对应的权值之和。
    • 十六进制

      1. (简写为hex或下标16)在数学中是一种逢16进1的进位制。一般用数字0到9和字母A到F(或a~f)表示,其中A~F表示10~15,这些称作十六进制数字。

      2. 计算机网卡的 mac 地址通常用十六进制数表示

    • 六十进制

      • 时间、坐标、角度等量化数据

1.1.2 二进制运算的基础

  • 二进制转化为十进制:按权展开法

    • 正整数 N ,基数为 r
    • 如 N = 1024 —> N =
    • 再如 🌰:
      case1 : N = (01100101) = 1*2^6 + 1*2^5 + 1*2^2 + 1 = 101
      case2 : N = (11101101) = 1*2^7 + 1*2^6 + 1*2^5 + 1*2^3 + 1*2^2 + 1 = 237
      
  • (整数) 十进制转换二进制:辗转相除法

    • 以十进制数101为例🌰
    重复除以2 得商 取余数
    101/2 50 1
    50/2 25 0
    25/2 12 1
    12/2 6 0
    6/2 3 0
    3/2 1 1
    1/2 0 1

    结果为 N = (101) = 1100101(二进制) 从下至上取结果

    • 再以十进制数237为例 🌰
    重复除以2 得商 取余数
    237/2 118 1
    118/2 59 0
    59/2 29 1
    29/2 14 1
    14/2 7 0
    7/2 3 1
    3/2 1 1
    1/2 0 1

    结果为 N = (237) = 11101101(二进制) 从下至上取结果

  • (小数)二进制转十进制:按权展开法

    • 举例:

    case1 : N = (0.11001) = 1*2^-1 + 1*2^-2 + 1*2^-5 = 0.78125 = 25/32
    case2 : N = (0.01011) = 1*2^-2 + 1*2^-4 + 1*2^-5 = 0.34375 = 11/32
    
  • (小数)十进制转换二进制:辗转相乘法

    • 🌰 栗子1: 25/32 转二进制
    重复乘以2 得积 取1
    25/32 50/32 = 1 + 9/16 1
    9/16 18/16 = 1 + 1/8 1
    1/8 1/4 = 0 + 1/4 0
    1/4 1/2 = 0 + 1/2 0
    1/2 1 = 1 + 0 1

    结果为 N = (25/32) = (系数1前面是“+”) = 0.11001(二进制)
    注意⚠️:是 从上至下取结果,与整数转换进制顺序是相反的,做完可以自己验算一下的,可别搞混了

    • 🌰 栗子2: 11/32 转二进制
    重复乘以2 得积 取1
    11/32 11/16 = 0 + 11/16 0
    11/16 11/8 = 1 + 3/8 1
    3/8 3/4 = 0 + 3/4 0
    3/4 3/2 = 1 + 1/2 1
    1/2 1/1 = 1 + 0 1

    结果为 N = (11/32)= (系数1前面是“+”) = 0.01011(二进制)
    注意⚠️:是 从上至下取结果,与整数转换进制顺序是相反的

2 二进制数据的表示方法

2.1 有符号数与无符号数

在之前举的例子中二进制数都是默认正数的例子,那 负数怎么办呢? 众所周知,十进制中用+表示正数-表示负数,计算机中无法不识别这样的符号,二进制 使用 0 表示正数,使用 1 表示负数 。这样表示还有一个问题是 怎么判断它是数字位还是符号位呢? 十进制将符号写在数值前面表示正负,如+237-237,二进制中同样采用这种表示方式, 如下图所示:

2.2 二进制的原码表示法

👆上述的二进制数表示方法即为 原码表示法 ,总结原码表示法如下:

  • 使用 0 表示正数、1表示负数
  • 规定符号位位于数值第一位
  • 表达简单明了,是人类易于理解的一种表示法

原码表示法有如下弊端:

  • 0 有两种表示方法,00(正零),10(负零),可能会有歧义
  • 原码进行运算非常复杂,特别是两个操作数符号不同的时候:
    1. 首先判断两个操作数绝对值大小
    2. 使用绝对值大的数减去绝对值小的数
    3. 对于符号值,以绝对值大的为准

针对上面原码表示法的缺点总结诉求:

  • 希望找到不同符号操作数更加简单的运算方法
  • 希望找到正数代替负数的方法
  • 使用加法操作代替减法操作

2.3 二进制的补码表示法

  • 补码的定义:

下面👇来做几道题,题目很容易,套公式就行了

  • 🌰 例子1:n = 4,x = 13, 计算 x 的二进制原码和补码


第一位是符号位,用逗号隔开了,0表示正数


  • 🌰 例子2:x= -13,计算x的二进制原码和补码

结果的第一位是符号位,用逗号隔开了,1表示负数


  • 🌰 例子3:x=-7,计算x的二进制原码和补码


结果的第一位是符号位,用逗号隔开了,1表示负数


  • 🌰 例子4:x=-1,计算x的二进制原码和补码

结果的第一位是符号位,用逗号隔开了,1表示负数

  • 引进补码的目的

    • 减法运算复杂,希望找到使用正数替代负数的方法
    • 使用加法代替减法操作,从而消除减法

    但是我们从前面几个例子中可以看到,计算补码的过程中还是使用了二进制的减法运算,于是我们引出了下面要提的 反码 的概念来解决这个痛点

2.4 二进制的反码表示法

  • 引进反码的是找出原码和补码之间的规律,消除转换过程中的减法
  • 反码的定义

  • 🌰 例子1:x= -13,计算x的二进制原码和反码


结果的第一位是符号位,用逗号隔开了,1表示负数


  • 🌰 例子2:x = -7,计算 x 的二进制原码和反码


结果的第一位是符号位,用逗号隔开了,1表示负数


我们通过几个例子可以得出:

  • 负数的反码等于原码除符号外按位取反
  • 负数的补码等于反码 +1

按位取反:每一位取反,0变成1,1变成0

  • 👇下面这张图来梳理运算引进原码、补码和反码全过程的脑图

2.5 纯小数(无整数部分)的二进制补码表示

  • 二进制纯小数(无整数部分)的补码表示如下

下面利用公式来做两道题巩固一下

  • 🌰 例子1:x = 9/16,计算x的二进制原码和反码和补码



  • 🌰 例子2:x = -11/32,计算x的二进制原码和反码和补码



答案中逗号前面的0表示正数,1表示负数

感谢阅读,未完待续

本文使用 mdnice 排版