c++ - 带unsigned int的字节数组的求余算法

标签 c++ algorithm optimization hashtable division

给定一个固定大小的 C++ 字节数组(模板函数)和一个无符号整数,我如何计算余数(通常是整数的 % 运算符)。

这是我目前使用 GMP 的方式:

template <typename HashType>
uint64_t remainder(const HashType& value, const uint64_t divisor)
{
    mpz_t integ;
    mpz_init(integ);
    mpz_import(integ, value.size(), 1, 1, 1, 0, value.data());
    uint64_t remainder = mpz_fdiv_ui(integ, divisor);
    mpz_clear(integ);
    return remainder;
}

移除 GMP 依赖并通过不需要设置和拆卸代码(只需直接使用字节数组)来提高性能会很好。

顺便说一句,是否有任何算法可以更快地找到余数,但仅适用于特定的除数子集(例如素数)? (仅供引用,这用于哈希桶,所以如果我可以选择除数的值)

最佳答案

如果 divisor 可以超过 56 位长,而你没有可用的 128 位整数类型,那么你不能用高级语言轻易地做这个长除法.因此,您可能应该使用汇编语言(为了速度)或 GMP(为了便于编码)。

这是否回答了您的问题?或者您对 divisor 的大小有限制吗?

关于c++ - 带unsigned int的字节数组的求余算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25089044/

相关文章:

c++ - 在 C++ 中创建和传递多维数组的优雅方法?

algorithm - 考虑以下代码片段。假设 A[0...n] 是一个数组,其元素是 0 到 n 之间的自然数

python - 从列表中删除重复项(算法速度)

java - 请讨论我的 Java 代码以找到因素(是否正确?)

algorithm - 优化所有子字符串的 trie 结构

c++ - doubleSpinBox 的 valueChanged 不起作用

c++ - assert(true) 警告签名/未签名不匹配

c++ - 编译器会优化 malloc/free 或 new/delete 对到 alloca

optimization - 英特尔汇编程序优化

javascript - 可以在 nodeJS 中创建 3D 多人游戏服务器