CSAPP学习笔记 day1

课程一

综述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TLBJAlgi-1618152935744)(C:\Users\10736\AppData\Roaming\Typora\typora-user-images\image-20210409185015611.png)]

for(i=0;i<n;i++){
    for(j=0;j<n;j++){
		dir[i][j] = sou[i][j] 
    }
}//耗时4.2ms
for(i=0;i<n;i++){
    for(j=0;j<n;j++){
		dir[j][i] = sou[j][i] 
    }
}//耗时82ms
func main() {
	n:=10000
	// fmt.Scanf("%d%d%d",&n,&m,&k)
	memo := make([][]int,n)
	dir := make([][]int,n)
	for i:=0;i<n;i++{
		memo[i] =make([]int,n)
		for j:=0;j<n;j++{
			memo[i][j] = j
		}
		dir[i] = make([]int, n)	
	}
	t :=time.Now()
	for i:=0;i<n;i++{
		for j:=0;j<n;j++{
			dir[i][j] = memo[i][j]
		}
	}
	waste1 := time.Since(t)
    fmt.Println(waste1)
	t =time.Now()
	for j:=0;j<n;j++{
		for i:=0;i<n;i++{
			dir[i][j] = memo[i][j]
		}
	}
	waste1 = time.Since(t)
    fmt.Println(waste1)
}
耗时对比
460.9516ms
5.1390021s

课程二

bits,byte,integer

浮点数表示
  • 8.25的二进制表示为1000-01
    • 解释,使用 - 来表示符号位,符号位左边 表示二进制整数,符号位右边表示二进制小数,表示方法为 2^(-n) n代表位数,例如符号位右边第一个数为1则代表2^(-1) 值为0.5, 因此0.25则表示为符号位右边 01
位运算
  • 01101001 这个二进制位可以表示一个数字集合 {0,4,6,7}(I/O 方法select里面的bitmap就是用的这种表示方式)
  • 76543210 红色字体即为表达的数字
  • 01010101 同理表示{0,2,4,6,}
    • 因此&可以表示两个集合的交集
    • |表示并集
    • ^表示差集(表示两者不同的,并不是常规意义上的减)
    • ~表示反集
  • &&,||,! 不是位运算符而是逻辑运算符
    • &&是不同的& 0x41 & 0x41 = 0x41 0x41 && 0x41 = 0x01
    • ||是不同的| 0x41 | 0x00 = 0x41 0x41 || 0x00 = 0x01
    • !是不同的~
  • >>和<<操作
    • >> 逻辑右移 前置位直接填充0
    • >> 算术右移 前置位填充符号位 (和负数操作相关)
  • 计算机数字表示形式 以5个bit表示
    • 无符号位时 umax
      • 表示的数字最大为 11111 16+8+4+2+1=31
      • 表示的范围为0 - 2^n-1 n为比特位
    • 有符号位
      • 最大数字为 01111 8+4+2+1 = 15 TMAX
      • 最小数字为 10000 -16+0 = -16 TMIN
      • 11111 表示的值为 -16+8+4+2+1 = -1
    • 因此补码表示负数 为原码取反然后加一
      • 00001 值为1 取反为 11110 然后加一 11111 值为-1
    • T2U 和U2T 有符号转无符号和无符号转有符号
      • 以上面为例,-1 经过T2U得到 31
      • [0-15]范围内的数字不会发生变化
  • 有符号扩充位数
    • 一个字符为 1110 首位是符号位 值为-2
      • 如果进行有符号的扩充 变为11110 首位还是符号位 值还是为原来的 -2
      • 所以如果想扩大数的位数表示,大于0的前面直接填0,而小于0的数前面直接添加1 (4 变8)
        • 0011 -> 0000 0011 正数 3
        • 1011 -> 1111 1011 负数 -5
    • 如果一个字符为 10101 首位为符号位 -11
      • 删除符号位为0101 =5 可以理解为-11 mod -16 = 5
    • 一个数为 10101 首位不为符号位 21
      • 删除首位 0101 = 5 21 mod 16 = 5
加减运算
  • 无符号相加

    • 假设byte位只有4位存储
      • 1101=13
      • 0101=5
      • 二者相加得 10010 因为只有4位 第5位舍弃,则结果为0010=2
      • 结果:(13+5)mod(10000(2))=2
  • 有符号相加

    • 假设4位bits 有符号位
      • 1101 = -3
      • 0101 = 5
      • -3+5 = 10010 舍弃超出的位数,得到0010 = 2
    • 补码可以将 加减全变为加法运算。
      • 1101 = -3 1101=-3
      • 二者相加 = 11010 不要超出的一位 得1010 = -6
  • 负溢出(假设存储位为4位)

    • 1011 = -5
    • 1011+1011 = 10110 舍弃最高位 得 0110 = 6 这就是负溢出
  • 正溢出

    • 0101 =5
    • 0101+0101 = 1010 等于 - 6 这就是正溢出
乘法运算(同样是4bit)
  • 无符号位时

    • 5*5 = 25 11001 舍弃最高位 = 1001 = 9 等于25(mod)16(10000)
  • 有符号位时

    • 5*5 = 25 11001 舍弃最高位 加上符号位 = -7
    • 5*4 = 20 10100 同理 = 4
  • 补码乘法 U代表无符号位

    • 1101 = -3 (13U)
    • 1110 = -2 (14U)
    • 13*14 = 182 转为二进制为 0xb6 1011,0110 舍弃多得4位 得 0110 = 6
  • 一个数乘除 2^N 可以左移或者右移N

    • 无符号右移
      • 0110 = 6
        • >>1= 0011 = 3
        • >>2 =0001 = 1 向下取整
    • 有符号右移
      • 1010 = -6 算术移位 不是逻辑移位
        • >>1 = 1101 = -3
        • >>2 = 1110 = -2
        • 需要添加偏移量 +1
        • 1101 +1 变为 1110 然后再移位 = 1111 = -1
        • 计算机在进行移位操作时会添加偏移量再移位(尽量避免除法运算,除法运算会花费30个clock(时钟周期))
    • 负数得计算就是 取法然后加一
  • 大端序和小端序

    • 最低有效位放在首位是小端序
    • 最低有效位存在尾端是大端序
浮点数
  • IEEE标准浮点数(标准化值)

    • v = ( − 1 ) s ∗ M ∗ 2 E E = E x p − B i a s v = (-1)^s*M*2^E\\ E = Exp-Bias\\ v=(1)sM2EE=ExpBias

    • E x p = u n s i g n e d v a l u e o f e x p f i e l d B i a s = 2 k − 1 − 1 , k = n u m b e r o f e x p → s i g l e p r e c i s i o n : 127 → d o u b l e p r e c i s i o n : 1023 Exp = unsigned value of exp field\\ Bias = 2^{k-1}-1,k = number of exp\\ \rightarrow sigle precision: 127\\ \rightarrow double precision:1023\\ Exp=unsignedvalueofexpfieldBias=2k11,k=numberofexpsigleprecision:127doubleprecision:1023

      • Minimum when frac=000…0(M=1.0)
      • Maximum when frac=111…1(M=2.0-e) (e是精度)
      • 默认为1.0是为了多一个默认位
    • 32 bits

      • s(符号位) exp(整数位) frac(小数位) 1:8:23
    • 64 bits

      • s(符号位) exp(整数位) frac(小数位) 1:11:52
    • Value: float F= 15213.0

      • 1521 3 10 = 1110110110110 1 2 = 1.110110110110 1 2 ∗ 2 13 15213_{10}=11101101101101_2\\ =1.1101101101101_2*2^{13}\\ 1521310=111011011011012=1.11011011011012213

      • M = 1.110110110110 1 2 f r a c = 110110110110 1 2 M =1.1101101101101_2\\ frac = 1101101101101_2\\ M=1.11011011011012frac=11011011011012

      • E = 13 B i a s = 127 E x p = 140 = 1000110 0 2 E = 13\\ Bias = 127\\ Exp = 140 = 10001100_2\\ E=13Bias=127Exp=140=100011002

      • 最 终 表 示 结 果 : 0 ∣ 10001100 ∣ 11011011011010000000000 最终表示结果:0|10001100|11011011011010000000000 01000110011011011011010000000000

      • s 符号位为0,exp = 10001100

      • frac = 11011011011010000000000

0 < = E x p < = 255 − 127 < = E < = 128 0<=Exp<=255\\ -127<=E<=128 0<=Exp<=255127<=E<=128

  • Denormalized Values(非标准化值)
    • E = 1 - Bias
    • M = 0.xxxx, frac = xxxx
    • exp 全为1 frac全为0 表示无穷大
    • exp 全为1 frac不全为0 表示Not a Number
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值