Lecture 2:Bits,Bytes and Integers
#1 everything is bits
- Each bit is 0 or 1
- 计算机中采用二进制进行信息表示,虽然在很多时候这需要转换,例如,十进制在生活中更为常见:十个手指…
- 实际上也只有宾夕法尼亚大学建立的第一台电子计算机ENIAC使用十进制进行算数运算,使用十个电子管来表示每个数字,通过控制电子管的开关来表示10个数字中的其中一个。
- Importance of bits
——By encoding/interpreting sets of bits in various ways
①在数字世界中,可以采取其他方式的模拟信号对比特进行量化。
e.g.比如下图,用低电压表示0,高电压区间表示1,即使电路中可能存在噪音或不完善的地方或者其他干扰;只要不超过设定的阈值,我们依然可以得到一个很清晰的0/1信号。
②数字存储
存储一位信息或一个数字值比存储一个模拟值要容易得多。
#2 Encoding Byte Values
- 比特的分组计算
因为对一个冗长的二进制串进行计算往往不具有可行性和可观性。
我们通常将4比特的数据集合分组,使用16进制表示【0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F】
- About Bytes
- Example Data Representations
①事实上,不同类型的数的占位往往还与特定的机器和编程语言有关。在编程使用前,应该先详细了解相关规定。
②虚拟地址空间是由机器字长决定的。
当人们讨论到这是一个64位机器的时候,真正的含义是这些地址是64位值或8字节的。
#3 Bit-level manipulations
- Boolean Algebra
- 之前的内容让我们明确了,计算机中用二进制表示数据,不同类型数据占用不同长度。
- 接下来考虑位级运算,其中最基础的知识就是布尔代数
- 布尔代数在1850年前后由George Boole的人提出,具体描述比特之间的关系
p.s.在当时并没有“比特”这样的概念
(1)布尔代数是对逻辑的抽象:把True编码成1,把False编码成0。
(2)基本的位运算:AND OR NOT NOR
(3)对比特向量进行相应操作
——就是对比特串的每一位按照运算规则进行操作
- Representing & Manipulating Sets
人们喜欢使用布尔代数进行逻辑运算,也在于,这是一种隐式的表示数值集合的方式。
(1) 集合的表示
-
对于长度为w的一个比特串可以表示对于w个元素的包含情况。
-
某一对应位为0,表示该元素不存在;某一对应位为1,表示该元素存在。
(2)集合上的操作
- 在这种情况下,AND相当于求交集;OR相当于求并集;NOR相当于是对称差异;而NOT就是补集
- 这些操作在我们处理文件I/O时很常见
- Shift Operations
左移只有一种;而右移往往分为逻辑右移和算数右移。
- 在逻辑右移中,始终用0填充空值。
- 在算数右移中,填充的符号根据原来数字的符号位决定。
#4 Intergers
#4.1 Representation:unsigned and signed
- Encoding Integers
上面公式中代表的核心思想是按权对位进行加和运算。
有符号和符号方案只是对于最高位的赋权不同。
E.g.
也正因为此,在有符号表示方案中,最高位也称为符号位。
- Numeric Ranges
p.s.其中U表示无符号数(原码),T表示有符号数(补码)
在这一部分,教授提出了两点见解。
其一,可能很多人对于给定位数的二进制串中最小的数的补码表示,没有建立直观印象。
如果想一想各个位的权重,只有首位是负的,I其他位都是正的,自然只有1000…0这样的补码串代表的数值最小。
**其二,**如果不想迷失在n位表示的符号数/无符号数的数值范围的公式中,最可行的方法就是在n比较小的时候,直接推导,再将规律泛化。
- Sign Extension
概述:通过讲述了符号数和无符号数,这里引出最后一类位操作——符号拓展。
所谓符号拓展是针对补码表示的二进制串而言,核心思路是希望可以找到一个措施,使得在拉长二进制串的同时不改变其数值的大小。
基本方法就是,将符号位复制在串的左部。
通过复制这种符号的方式,可以看到它给了两倍的权重,将原来的符号位变成了正数,因此没有改变总和的净效益。