跳到主要内容

位运算

多字节数据的存储

多字节数据的地址是它在虚拟内存中序号最小的字节的地址;在绝大多数场合下,这些字节从最不重要到最重要的顺序排布。

数据的二进制表示

  1. 用长度为 ww 的位向量 x\vec x 来记录 ww 位的二进制表示
  2. B2TwB2T_wB2UwB2U_w 表示对二进制表示的解读
  3. 相反也可以用 U2BwU2B_wT2BwT2B_w 将值转换为二进制表示
  4. 无符号和有符号值之间通过 U2TwU2T_wT2UwT2U_w 转换
  5. TMinw,TMaxw,UMaxwTMin_w, TMax_w, UMax_w 表示几个特殊值
  6. +wt,+wu,wt,wu,wt,wu+^t_w, +^u_w, *^t_w, *^u_w, -^t_w,-^u_w是值之间的运算
B2Uw(x)=i=0w1xi2iB2U_w(\vec x)=\sum_{i=0}^{w-1}x_i2^i UMaxw=2w1UMax_w=2^w-1 B2Tw(x)=i=0w2xi2ixw12w1B2T_w(\vec x)=\sum_{i=0}^{w-2}x_i2^i-x_{w-1}2^{w-1} TMaxw=2w11;TMinw=2w1TMax_w=2^{w-1}-1;\quad TMin_w=-2^{w-1} T2Uw(x)=B2Uw(T2Bw(x))={x+2wx<0xx0T2U_w(x)=B2U_w(T2B_w(x))=\begin{cases}x+2^w&x<0\\x&x\ge0\end{cases} U2Tw(u)={uxTMaxwu2wu>TMaxwU2T_w(u)=\begin{cases}u&x\le TMax_w\\u-2^w&u>TMax_w\end{cases}

扩展与截断

  1. w>ww'>w,则对无符号整数用 0 扩展使得 B2Uw(u)=B2Uw(u)B2U_w(\vec u)=B2U_{w'}(\vec u')
  2. w>ww'>w,则对有符号整数用最高位扩展使得 B2Tw(x)=B2Tw(x)B2T_w(\vec x)=B2T_{w'}(\vec x')
  3. w<ww'<w,则对无符号整数截断使得 u=umod2wu'=u\mod 2^{w'}
  4. w<ww'<w,则对有符号整数截断使得 x=U2Tw(xmod2w)x'=U2T_{w'}(x\mod 2^{w'})

运算

  1. s=x+wuy=(x+y)mod2ws=x+^u_wy=(x+y)\mod 2^{w},如果 s<xs<x(等价地,s<ys<y)则发生了上溢
  2. wux=xmod2w-^u_wx=-x\mod 2^w
  3. s=x+wty=U2Tw((x+y)mod2w)s=x+^t_wy=U2T_{w}((x+y)\mod 2^w),如果 x,yx,y 符号相同但与 ss 符号不同则发生了上溢
  4. wtx=U2Tw(xmod2w)-^t_wx=U2T_w(-x\mod 2^w)
  5. xwuy=xymod2wx*^u_wy=xy\mod 2^w
  6. xwty=U2Tw(xymod2w)x*^t_wy=U2T_w(xy\mod 2^w)
  7. 对无符号数 xx << k 得到 xwu2kx*^u_w2^k
  8. 对有符号数 xx << k 得到 xwu2kx*^u_w2^k
  9. 对无符号数 xx >> k 得到 x/2k\lfloor x/2^k\rfloor
  10. 对有符号数 xx >> k 得到 x/2k\lfloor x/2^k\rfloor,但 (x + (1 << k) - 1) >> k 得到 x/2k\lceil x/2^k\rceil