课程一
综述
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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]范围内的数字不会发生变化
- 无符号位时 umax
- 有符号扩充位数
- 一个字符为 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
- 一个字符为 1110 首位是符号位 值为-2
加减运算
-
无符号相加
- 假设byte位只有4位存储
- 1101=13
- 0101=5
- 二者相加得 10010 因为只有4位 第5位舍弃,则结果为0010=2
- 结果:(13+5)mod(10000(2))=2
- 假设byte位只有4位存储
-
有符号相加
- 假设4位bits 有符号位
- 1101 = -3
- 0101 = 5
- -3+5 = 10010 舍弃超出的位数,得到0010 = 2
- 补码可以将 加减全变为加法运算。
- 1101 = -3 1101=-3
- 二者相加 = 11010 不要超出的一位 得1010 = -6
- 假设4位bits 有符号位
-
负溢出(假设存储位为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 向下取整
- 0110 = 6
- 有符号右移
- 1010 = -6 算术移位 不是逻辑移位
- >>1 = 1101 = -3
- >>2 = 1110 = -2
- 需要添加偏移量 +1
- 1101 +1 变为 1110 然后再移位 = 1111 = -1
- 计算机在进行移位操作时会添加偏移量再移位(尽量避免除法运算,除法运算会花费30个clock(时钟周期))
- 1010 = -6 算术移位 不是逻辑移位
- 负数得计算就是 取法然后加一
- 无符号右移
-
大端序和小端序
- 最低有效位放在首位是小端序
- 最低有效位存在尾端是大端序
浮点数
-
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)s∗M∗2EE=Exp−Bias
-
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=2k−1−1,k=numberofexp→sigleprecision:127→doubleprecision: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.11011011011012∗213
-
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 最终表示结果:0∣10001100∣11011011011010000000000
-
s 符号位为0,exp = 10001100
-
frac = 11011011011010000000000
-
-
0 < = E x p < = 255 − 127 < = E < = 128 0<=Exp<=255\\ -127<=E<=128 0<=Exp<=255−127<=E<=128
- Denormalized Values(非标准化值)
- E = 1 - Bias
- M = 0.xxxx, frac = xxxx
- exp 全为1 frac全为0 表示无穷大
- exp 全为1 frac不全为0 表示Not a Number