前言:一文掌握计算机必备基础之数据表示及运算(上)
1 进制运算的基础知识
1.1 进制运算的基础
1.1.1进制概述
- 进制的定义
![]()
![]()
如 n = 10[0-9] 称为十进制(通过 0-9 这十个符号表示无限的数值)
- 常见的几种进制
二进制
- 二进制数据是用 0 和 1 两个数码来表示的数。它的基数为 2,进位规则是“逢二进一”,借位规则是“借一当二”。
- 当前的计算机系统使用的基本上是二进制系统,计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。
八进制
- Octal, 缩写 OCT 或 O , 一种以 8 为基数的计数法, 采用0,1,2,3,4,5,6,7八个数字,逢八进1。
- 八进制的数和二进制数可以按位对应(八进制一位对应二进制三位),因此常应用在计算机语言中。
十进制
- 全世界通用的一种进制,古代世界中最先进、科学的记数法
- 满十进一,满二十进二,以此类推……
- 按权展开,第一位权为10^0,第二位10^1……以此类推,第N位10^(N-1),该数的数值等于每位的数值*该位对应的权值之和。
十六进制
(简写为hex或下标16)在数学中是一种逢16进1的进位制。一般用数字0到9和字母A到F(或a~f)表示,其中A~F表示10~15,这些称作十六进制数字。
计算机网卡的 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(负零),可能会有歧义
- 原码进行运算非常复杂,特别是两个操作数符号不同的时候:
- 首先判断两个操作数绝对值大小
- 使用绝对值大的数减去绝对值小的数
- 对于符号值,以绝对值大的为准
针对上面原码表示法的缺点总结诉求:
- 希望找到不同符号操作数更加简单的运算方法
- 希望找到正数代替负数的方法
- 使用加法操作代替减法操作
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 排版