zoukankan      html  css  js  c++  java
  • 2.3 整数计算

    2.3 整数计算

    2.3.1 无符号加法

    对于满足(0 leq x,quad y<2^w)的整数(x)(y)有:

    [x +_{w}^{u} y=egin{cases} x+y,quad x + y < 2^w\ x + y - 2^w,quad 2^wleq x+y < 2^{w+1} end{cases} ]

    检测无符号数加法中的溢出

    对在范围(0 leq x,quad yleq UMax_x)中的(x)(y),令(s dot{=} x+_{w}^{u}y)。则对计算结果s,当且仅当(s < x)(或者等价于(s < y))时,发生了溢出。

    加法逆元

    对于每个值(x),必然有其对应的加法逆元(-_{w}^{u}x)满足(-_{w}^{u}x +_{w}^{u}x=0)。该加法的逆操作表述如下:

    • 无符号数逆元

    对满足(0leq x < 2^w)的任意(x),其(w)位的无符号逆元(-_{w}^{u}x)由下式给出:

    [-_{w}^{u} x=egin{cases} x,quad x = 0\ 2^w - x,quad x > 0 end{cases} ]

    • 补码逆元

    对满足(-2^{w-1}leq x leq 2^{w-1} - 1)的任意(x),其(w)位的无符号逆元(-_{w}^{t}x)由下式给出:

    [-_{w}^{t} x=egin{cases} TMin_w,quad x = TMin_w\ - x,quad x > TMin_w end{cases} ]

    2.3.2 补码加法

    对于满足(-2^{w-1}leq x,quad y leq 2^{w-1} - 1)的整数(x)(y)有:

    [x +_{w}^{t} y=egin{cases} x+y - 2^{w},quad x + y > 2^{w-1} - 1 qquad extrm{正溢出}\ x + y,qquad -2^{w-1}leq x+y leq 2^{w-1}-1 quad extrm{正常} \ x + y + 2^{w}, quad x + y < -2^{w-1} extrm{负溢出} end{cases} ]

    两个数的(w)位补码之和与无符号数之和有相同的位级表示

    检测补码加法中的溢出

    对满足(TMin_w leq x, y leq TMax_w)(x)(y),令(s dot{=} x+_{w}^{t}y),当且仅当(x>0, y > 0),但(s leq 0)时,计算(s)发生了正溢出。当且仅当(x < 0, y < 0),但(s geq 0)时,计算(s)发生了负溢出。

    计算一个位级表示的值的补码非(加法逆元)的两种便捷方法:
    • 对每一位求补(取反),再对结果加1。
    • 找到位级表示最右边的1的位置,设为第k位,将位k左边的所有位取反。
    2.3.4 无符号乘法

    对于满足(0 leq x, y leq UMax_x)(x)(y)有:

    [x*_w^uy=(x cdot y)mod(2^w) ]

    2.3.5 补码乘法

    对于满足(TMin_w leq x, y leq TMax_w)(x)(y)有:

    [x*_w^ty=U2T_w((x cdot y)mod(2^w)) ]

    对于无符号和补码乘法运算来说,乘法运算的位级表示都是一样的。

    2.3.6 乘以常数
    • 与2的幂相乘的无符号乘法

    [x<<k表示x*_w^u2^k ]

    • 与2的幂相乘的补码乘法

    [x<<k表示x*_w^t2^k ]

    由于整数乘法比移位和加法的代价大得多,所以许多c语言编译器试图以移位、加法和减法的组合来消除很多整数乘以常数的情况。

    2.3.7 除以2的幂

    无符号数和补码分别使用逻辑移位和算术移位来达到目的。整数除法总是向0方向舍入。

    • 除以2的幂无符号数除法,直接右移,向下取整

    [x>>k等价于lfloor x/2^k floor ]

    • 补码直接算术右移,会使结果向下舍入,通过移位前添加偏置,使其向上舍入。

    [(x+(1<<k)-1)>>k等价于lceil x/2^k ceil ]

  • 相关阅读:
    java 标准异常
    java 重新抛出异常
    java 异常链
    java 轨迹栈
    mysql死锁-非主键索引更新引起的死锁
    数据库事务
    JMS学习笔记(一)
    log4j中将SocketAppender将日志内容发送到远程服务器
    Kubernetes之kubectl常用命令
    java代理与动态代理的学习
  • 原文地址:https://www.cnblogs.com/BigMario/p/14464485.html
Copyright © 2011-2022 走看看