我需要一个使用两个 32 位整数作为参数的算法,并返回这些参数的乘法,并将其拆分为另外两个 32 位整数:32 最高位部分和 32 最低位部分。
我会尝试:
uint32_t p1, p2; // globals to hold the result
void mult(uint32_t x, uint32_t y){
uint64_t r = (x * y);
p1 = r >> 32;
p2 = r & 0xFFFFFFFF;
}
Run Code Online (Sandbox Code Playgroud)
虽然它可以工作1,但不能保证机器中存在 64 位整数,也不能保证编译器使用它们。
那么,怎样才是最好的解决方法呢?
注1:实际上,它不起作用,因为我的编译器不支持64位整数。
Obs:请避免使用boost。
只需使用 16 位数字即可。
void multiply(uint32_t a, uint32_t b, uint32_t* h, uint32_t* l) {
uint32_t const base = 0x10000;
uint32_t al = a%base, ah = a/base, bl = b%base, bh = b/base;
*l = al*bl;
*h = ah*bh;
uint32_t rlh = *l/base + al*bh;
*h += rlh/base;
rlh = rlh%base + ah*bl;
*h += rlh/base;
*l = (rlh%base)*base + *l%base;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
849 次 |
| 最近记录: |