移位操作
对于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]