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位.
用汇编其实很麻烦.
--------------------------------
内联汇编的话,
如果实现的是大于机器所能表示的数.
比如最多能表示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位.
用汇编其实很麻烦.
--------------------------------
内联汇编的话,
如果实现的是大于机器所能表示的数.
比如最多能表示64位,却要实现128位.
用汇编其实很麻烦.
#7
我也想知道两个32位的定点除法该怎么做,有没有好的算法啊?