LiangYongrui's Studio.

CSAPP读书笔记(一)

2017/01/11 Share

这个系列只写了CSAPP第三版对于我的收获。

Amadhl定律

主要观点,想要显著加速整个系统,必须提升全系统中相当大的部分的速度。

和木桶效应有类似之处,但是和它有很大的不同。

加速比例 S=1/(1-a+a/k),a是该部分的重要程度,k是该部分的提升比

一道很有意思的位运算题目:

你只有两种操作

bis(x, y): 在y为1的每个位置上,将x的对应的位设为1
bic(x, y): 在y为1的每个位置上,将x的对应的位设为0

简单的化简一下

bis(x, y): return x | y;
bic(x, y): return x & ~y;

任务:实现XOR运算

解析:

异或就意味着, 一边为1 一边为0。

所以答案就是

bis(bic(x, y), bic(y, x));

补码

对补码有了新的理解,由于这里写公式不是很方便就不贴了(见书P45

B2T(Binary to Two’s-complement)向整数的映射,就是最高位的权重取负数再求和

e.g.

B2T([1011]) = -12^3 + 02^2 + 12^1 + 12^0 = -8+0+2+1 = -5

这个就更直观的解释了:

补码表示的整数范围的最小值是-2^(w-1), 最大值是2^(w-1)-1

例如长度为4位的位模式TMin([1000])=-8, TMax([0111])=7

几乎所有的现代机器都使用补码表示有符号整数

在C/C++中,无符号数和有符号数比较会产生意想不到的效果。

因为有符号数是用补码表示的,当无符号数和有符号数同时比较的时候,有符号数会被隐式的强制转换为无符号数

e.g. -1 > 0u 是true

截断数字:减少表示数字的位数。

公式见P57

简单的来说就是,把数字的二进制形式直接减少,不用做别的处理
e.g.

1
2
3
4
5
6
7
8
9
int main()
{
int x = 53191;
short sx = (short) x;
cout << sx << endl;
int y = sx;
cout << y << endl;
return 0;
}

结果是

-12345
-12345
CATALOG
  1. 1. Amadhl定律
  2. 2. 一道很有意思的位运算题目:
  3. 3. 补码
  4. 4. 在C/C++中,无符号数和有符号数比较会产生意想不到的效果。
  5. 5. 截断数字:减少表示数字的位数。