2021.10.02 CS:APP 2.1,2.2

移位操作

对于w位的x ,位表示为[Xw-1,Xw-2,Xw-3,.......,X2,X1,X0]

x<<k:   x左移k位,丢弃最高的k位,在右端补k个0,位表示为[Xw-k-1,Xw-k-2,......,X2,X1,X0,0,0,...0]

x>>k:   

逻辑右移:x右移k位,丢弃最低的k位,往左端补k个0,位表示为[0,0,0......,Xw-1,Xw-2,......,Xk+2,Xk+1,Xk]

算术右移:往左端补k个最高位,位表示为[Xw-1,Xw-1,Xw-1,......Xw-1,Xw-2,......,Xk+2,Xk+1,Xk]     当最高位为0时,算术右移与逻辑右移等价

因为移位指令只考虑位移量低的log2(w)位,所以当k≥w时,实际位移量为k mod w

例如w = 32时,x<<32 ,x<<36, x<<48分别表示左移0 ,4 ,16位

在C语言中,对有符号数使用算术右移,无符号数必须是逻辑右移

在Java中,x>>k,表示算术右移k位,x>>>k,表示逻辑右移k位

移位优先级问题:

C语言中加减法的优先级要高于移位,所以1<<2+3<<4 = 1<<5<<4 = 512 而不是 1<<2+3<<4 =(1<<2)+(3<<4)=52

 

 

无符号数的编码

无符号数编码的定义:对向量x = [Xw-1,Xw-2,...X0]   ,B2Uw(x) = ∑Xi*2^i (i=0,......w-1),显然无符号编码具有唯一性,每一个0~2^w - 1的数都对应唯一一个w位的编码;每一个w位的编码都与唯一一个0~(2^w)  - 1 的数相对应,即函数B2Uw是一个双射 (binary to unsigned,w为位数)其反函数为U2Bw

补码编码

补码编码的定义:对向量x = [Xw-1,Xw-2,...X0]  ,B2Tw(x) = -Xw-1 * 2^w-1 + ∑Xi*2^i (i=0, ......w-2)  ,补码的最高有效位Xw-1为符号位,权重为-2^w-1,negative weight

同样的补码也具有唯一性,对应范围为 -2^(w-1) ~ (2^w-1)  - 1  函数B2Tw也为一个双射(binary to two's-complement) 其反函数为T2Bw

反码:除了最高位的权是-(2^w-1)-1而不是 (-2^w-1),它与补码是一样的。对于非负数x,-x的反码来源于 [111...1]-x,   -x的补码来源于2^w -x

原码:=(-1)^(Xw-1) * ∑Xi*2^i (i=0,......w-2),最高位是符号位

原码和反码都会产生两个0,原码和反码中的+0都是[00...0],原码中的-0是[10...0],反码中的-0是[11...1]

 

上一篇:坐标下降法


下一篇:git代码量统计,每人提交的代码量,前5名