每个bit是0或1
为什么选用bit?这是因为电子的实现
容易存储可以比特的元素抗干扰能力强(比如电路中存在噪声或者其他干扰)因此数字信号比模拟信号更好。
用布尔代数实现位运算
注意&&与&、|与||的区别,&&与||是判断条件的真假,(Bryant提到即使是有经验的C语言程序员也经常犯错!)
逻辑左移:将所有的bit位向左移位,右边填充0
逻辑右移:将所有的bit位向右移位,左边填充0
算术右移:将所有的bit位向右移位,左边填充1
首先数字分为无符号数(unsigned)和补码(Two's Complement)两种类型,我记得大三学习微机的时候国内教材说的是原码补码反码。
我们可以发现其实无符号数和有符号数是存在一定映射关系的。
当两个数字作比较的时候,如果两个数都是补码,那么就补码进行比较,但是一旦有一个是原码,那么另一个都会由上面的映射关系转换成原码。用(int)放在原码前面是将原码强制转换成补码比较。
这里老师还讲了一个性质 -x=~x+1
给定:w位整数x 要求将其扩展到w+k位同样大小的整数
规则:复制k个符号bit,将其放置于原X符号位前
举例
给定:k+w位原码或者补码的整数X 要求转换成k位同样大小的X
规则:扔掉头部k位bit(这里我有点困惑,因为按照下面的例子,做的是mod)
其中分为有符号位变化和无符号位变化,第一种无符号位变化,value是不会变的,但是第二种有符号位变化,value我们可以看到发生了改变。
下面是slides上面一个补码的相加(补码一般就是用来表示有符号数)溢出的情况。
老师给的例子是 1101(-3)+1010(-6) 此时相加结果为 1(drop) 0111(7)为负数加负数得到了正溢出,此种情况之后讨论。
无符号数相乘,当结果为2w个bit时候,我们会舍弃掉高位的w位bit,只留下w位。
标准乘法运算
忽略高位w个bit实现模运算功能Implements Modular Arithmetic
标准乘法运算
忽略高位w个bit跟无符号数比较,有一些和有符号数是不同的低位的bit是一样的将所有的bit position左移相当于把数字乘2
对于无符号数:将所有的bit position右移相当于把数字除以2,结果向下取整。
对于有符号数:上面的做法再数字小于0的时候,会round向偏向负无穷的方向。
向右移位也是因此需要算术右移的情况。
在JAVA中,设计者将所有的情况都用补码来表示,他们觉得unsigned number会造成太多trikcy的情况!太wierd!
word size这个词实际上并没有太多的意义。32位的机器可以用来存储的地址规模是4GB,而64位机器一般用47位bit来存储地址。
主要是 Little Endian 和 Big Endian
这个概念在之前我学计网的时候也碰到了,一般在系统中用的都是Little Endian,转到网络中传输的时候需要把Little Endian转到Big Endian,到另一个终端的时候,再转为Little Endian。
后记:上这节课的时候感觉还是有一些地方听不太懂,很多概念方法在这里总结的可能也有很多问题。但是这毕竟是我自己一个学习笔记,肯定会有很多疏漏,(连大佬都经常会犯错呢)。写完整的学习笔记的话,之后我在找实习以及工作的时候应该也能拿出来翻一翻吹吹小牛逼,如果面试官也恰好上过这门课那还可以交流上课经验,哈哈哈,我真是个小机灵鬼。