设为首页 加入收藏

TOP

定点小数补码一位乘(二)
2012-12-02 22:59:29 来源: 作者: 【 】 浏览:587
Tags:定点 小数 一位


    {
    bitset<n + 2> A;                                  // A放部分积(最后是积的高位)
    bitset<n + 2> tmp = GetComplement(X).to_ullong();
    tmp[n + 1] = tmp[n];                                // 注意补码最高位的扩展
    const bitset<n + 2> B(tmp);                           // B是X的补码  //无法利用返回值的不同而重载,故引入tmp
    bitset<n + 1> C = GetComplement(Y);                   // C是Y0.Y1Y2...Yn(Y的补码)
    int cd = n + 1;                                     // cd是计数器
    bool Yn1 = 0;
    #pragma region 核心算法
    while (cd--)
    {
    switch (Test(C[0], Yn1))    // 检测Y(i+1)-Y(i)
    {
    case _00: case _11:
    break;
    case _10:
    A = A - B;
    break;
    case _01:
    A = A + B;
    break;
    default:
    break;
    }
    if (cd != 0)    // 最后一次不移位
    {
    RightMove(A, C, Yn1);   // A,C联合右移,C的低位移至Yn1
    }
    }
    #pragma endregion 核心算法
    return GetComplement(A, C);
    }
    bitset<2 * n + 1> DirectMul(const bitset<n + 1> X, const bitset<n + 1> Y)
    {
    const bitset<n> x(X.to_ullong()); // 用截断高位的方法取绝对值
    const bitset<n> y(Y.to_ullong());
    bitset<2 * n + 1> ans(x.to_ullong() * y.to_ullong());
    ans[2 * n] = X[n] ^ Y[n];           // 最后单独计算符号位
    return ans;
    }
    int main(int argc, char **argv)
    {
    //freopen(“cin.txt”, “r”, stdin);
    string inputStrX;
    string inputStrY;
    while (cin >> inputStrX >> inputStrY)
    {
    const bitset<n + 1> X(inputStrX); // X是被乘数
    const bitset<n + 1> Y(inputStrY); // Y是乘数
    cout << “ComplementOneMul:\t” << X << “ * ” << Y << “ = ”
    << ComplementOneMul(X, Y) << endl;
    cout << “DirectMul:\t\t” << X << “ * ” << Y << “ = ”
    << DirectMul(X, Y) << endl << endl;
    }
    return 0;
    }
    运行结果:

 

      

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++派生类与基类的转换 下一篇POJ 3981 字符串替换

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: