如何实现32位模拟64位运算?

时间:2022-01-02 03:34:32
目标系统最大支持40位数据类型,要实现64位的加减乘除.我是先定义了一个结构体,用两个32位整形表示64位数据,还有一个符号位,加法是用补码的形式计算,其他乘除不知道有什么好的办法?

7 个解决方案

#1



// 计算(u*v)%m

unsigned mul_mod(unsigned u, unsigned v, unsigned z)
{
    // 如果u*v没有溢出, 则直接计算

    if((u*v)/u == v) return (u*v)%z;

    // 进行长乘法(结果为64位)

    unsigned u0, v0, w0;
    unsigned u1, v1, w1, w2, t;
 
    u0 = u & 0xFFFF;  u1 = u >> 16;
    v0 = v & 0xFFFF;  v1 = v >> 16;
    w0 = u0*v0;
    t  = u1*v0 + (w0 >> 16);
    w1 = t & 0xFFFF;
    w2 = t >> 16;
    w1 = u0*v1 + w1;

    // x为高32位, y为低32位

    unsigned x = u1*v1 + w2 + (w1 >> 16);
    unsigned y = u*v;

    // 进行长除法(被除数为64位)
 
    for (int i = 1; i <= 32; i++)
    {
        t = (int)x >> 31;           // All 1's if x(31) = 1. 

        x = (x << 1) | (y >> 31);   // Shift x || y left 
        y <<= 1;                    // one bit.
        
        if((x|t) >= z) { x -= z; y++; } 
    }

    return x;    // y为商, x为余数
}

#2


顶一下,也想知道这个问题怎么解决。就是一个struct{int high;int low}long64怎么实现它的乘除法。

#3


学习~~

#4


如果是我的话,会选择内联汇编

#5


#6


如果是我的话,会选择内联汇编

--------------------------------
内联汇编的话,
如果实现的是大于机器所能表示的数.
比如最多能表示64位,却要实现128位.
用汇编其实很麻烦.

#7


我也想知道两个32位的定点除法该怎么做,有没有好的算法啊?

#1



// 计算(u*v)%m

unsigned mul_mod(unsigned u, unsigned v, unsigned z)
{
    // 如果u*v没有溢出, 则直接计算

    if((u*v)/u == v) return (u*v)%z;

    // 进行长乘法(结果为64位)

    unsigned u0, v0, w0;
    unsigned u1, v1, w1, w2, t;
 
    u0 = u & 0xFFFF;  u1 = u >> 16;
    v0 = v & 0xFFFF;  v1 = v >> 16;
    w0 = u0*v0;
    t  = u1*v0 + (w0 >> 16);
    w1 = t & 0xFFFF;
    w2 = t >> 16;
    w1 = u0*v1 + w1;

    // x为高32位, y为低32位

    unsigned x = u1*v1 + w2 + (w1 >> 16);
    unsigned y = u*v;

    // 进行长除法(被除数为64位)
 
    for (int i = 1; i <= 32; i++)
    {
        t = (int)x >> 31;           // All 1's if x(31) = 1. 

        x = (x << 1) | (y >> 31);   // Shift x || y left 
        y <<= 1;                    // one bit.
        
        if((x|t) >= z) { x -= z; y++; } 
    }

    return x;    // y为商, x为余数
}

#2


顶一下,也想知道这个问题怎么解决。就是一个struct{int high;int low}long64怎么实现它的乘除法。

#3


学习~~

#4


如果是我的话,会选择内联汇编

#5


#6


如果是我的话,会选择内联汇编

--------------------------------
内联汇编的话,
如果实现的是大于机器所能表示的数.
比如最多能表示64位,却要实现128位.
用汇编其实很麻烦.

#7


我也想知道两个32位的定点除法该怎么做,有没有好的算法啊?