首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >32位整数乘法高阶位的高效计算

32位整数乘法高阶位的高效计算
EN

Stack Overflow用户
提问于 2009-09-08 23:54:36
回答 3查看 3.1K关注 0票数 10

许多CPU具有单个汇编操作码,用于返回32位整数乘法的高阶位。通常,将两个32位整数相乘会产生64位结果,但如果将其存储在32位整数中,则会将其截断为低32位。

例如,在PowerPC上,毛尔操作码返回一个时钟中32x32位乘法的64位结果的高32位。这正是我要找的,但更轻便。在NVidia数据自动化系统中也有类似的操作码umulhi()。

在C/C++中,是否有一种有效的方法来返回32x32乘法的高阶位?目前,我通过将其转换为64位来计算它,如下所示:

代码语言:javascript
运行
复制
unsigned int umulhi32(unsigned int x, unsigned int y)
{
  unsigned long long xx=x;
  xx*=y;
  return (unsigned int)(xx>>32);
}

但这比常规的32乘32乘法慢11倍以上,因为我使用的是64位的数学运算,即使是乘法也是如此。

有更快的方法来计算高阶位吗?

这显然是,而不是--最好用BigInteger库来解决(这会造成巨大的开销)。

SSE似乎有PMULHUW,16x16 ->顶级16位版本,但没有像我想要的32x32 ->顶级32版本。

EN

Stack Overflow用户

发布于 2009-09-09 00:05:24

我不认为在标准的C/C++中有比你已经拥有的更好的方法来做到这一点。我要做的是编写一个简单的程序集包装器,返回您想要的结果。

并不是询问Windows,而是作为一个示例,尽管Windows有一个API,听起来它可以实现您想做的事情( 32位乘32位,同时获得完整的64位结果),但它将乘法实现为宏,执行您正在做的事情:

代码语言:javascript
运行
复制
#define UInt32x32To64( a, b ) (ULONGLONG)((ULONGLONG)(DWORD)(a) * (DWORD)(b))
票数 3
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1396942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档