C++两个uint64_t乘法输出128位结果的宏定义差异疑问
两个SEAL库宏的差异解答
两个宏的移位操作逻辑不同,本质是设计定位和输出需求完全不一样:
- 功能定位差异
第一个宏SEAL_MULTIPLY_UINT64_HW64的设计目标是仅获取两个uint64_t整数相乘得到的128位乘积的高64位。它不需要保留完整乘积,也不需要返回低64位结果,因此在计算出128位乘积后直接执行>>64右移操作,提取高64位写入传入的hw64指针指向的地址即可,省去了存储完整128位乘积、单独处理低64位的开销,适合只需要高位运算结果的场景,比如大整数乘法的进位计算、模运算的中间步骤等。
第二个宏SEAL_MULTIPLY_UINT64的设计目标是获取两个uint64_t整数相乘的完整128位乘积,并将其拆分为低64位、高64位两个部分存入传入的数组。因此它会先把完整的128位乘积暂存到product变量中,再分别处理两个部分:- 直接对
product做unsigned long long类型转换,截断得到低64位存入result128[0] - 对
product执行>>64右移操作提取高64位,转换后存入result128[1]
这种处理方式只需要执行一次乘法运算,就能同时拿到高低两个部分的结果,避免重复计算。
- 直接对
- 逻辑合理性说明
两个宏的移位时机差异完全是由输出需求决定的,不存在逻辑对错之分:只需要高64位时直接移位提取更高效;需要完整128位结果时先暂存全量乘积再分别处理,能减少重复运算的开销。
内容的提问来源于stack exchange,提问作者Rafaelo
相关产品推荐
相关产品推荐

