整数的拆分乘法
Split Multiplication of integers
我需要一种使用两个 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;
}
虽然它工作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;
}
正如我所评论的,您可以将每个数字视为长度为 32 的二进制字符串。
只需使用学校算术将这些数字相乘即可。您将获得一个 64 个字符长的字符串。
然后只是分区它。
如果你想要快速乘法,那么你可以看看卡拉苏巴乘法算法。
这是卡拉苏巴斯算法的解释和实现。我已经下载了代码并运行了几次。似乎它做得很好。您可以根据需要修改代码。
如果支持unsigned long
类型,这应该可以工作:
void umult32(uint32 a, uint32 b, uint32* c, uint32* d)
{
unsigned long long x = ((unsigned long long)a)* ((unsigned long long)b); //Thanks to @Толя
*c = x&0xffffffff;
*d = (x >> 32) & 0xffffffff;
}
逻辑从这里借来。
相关文章:
- 如何反转整数参数包
- enum是C++中的宏变量还是整数变量
- 如何在C++中将一个值拆分为一个十进制整数
- 如何拆分整数并将所有内容添加到数组中?
- 如何将此整数拆分为其原始值?
- 将向量整数拆分为这些数字的整数
- C++将字符串输入拆分为两个整数
- 使用C 从定界线拆分字符串中提取整数数组
- 试图将字符串拆分为两个整数
- 整数的拆分乘法
- 如何在C++中拆分字符串,其中包含两个由":"分隔的整数?
- C++ 将十进制字符串拆分为两个整数
- cin 如何拆分整数序列
- 一个简单的 C++ 连接/拆分字符串和 char 数组中的整数
- 在 c++ 中拆分一个字符串,从中获取一个整数和一个字符串值
- 拆分一个整数并找到最大的总和C++
- 将64位循环拆分为整数上的几个32位循环
- sscanf C++ 将字符串拆分为整数有时不起作用
- 将整数不向后拆分为数字
- 将整数的数字拆分为向量,旋转它们,然后转换回整数