c++ - 快速整除测试(2、3、4、5、..、16)?

标签 c++ c math assembly bit-manipulation

最快的整除测试是什么?比如说,给定一个 little-endian 架构和一个 32 位有符号整数:如何快速计算出一个数字可以被 2、3、4、5、... 最多 16 整除?

警告:给定的代码仅为示例。每条线都是独立的!在许多没有 DIV 硬件(如许多 ARM)的处理器上,使用模运算的明显解决方案很慢。一些编译器也无法进行此类优化(例如,如果除数是函数的参数或依赖于某些东西)。

Divisible_by_1 = do();
Divisible_by_2 = if (!(number & 1)) do();
Divisible_by_3 = ?
Divisible_by_4 = ?
Divisible_by_5 = ?
Divisible_by_6 = ?
Divisible_by_7 = ?
Divisible_by_8 = ?
Divisible_by_9 = ?
Divisible_by_10 = ?
Divisible_by_11 = ?
Divisible_by_12 = ?
Divisible_by_13 = ?
Divisible_by_14 = ?
Divisible_by_15 = ?
Divisible_by_16 = if(!number & 0x0000000F) do();

和特殊情况:

Divisible_by_2k = if(number & (tk-1)) do();  //tk=2**k=(2*2*2*...) k times

最佳答案

在所有情况下(包括可被 2 整除):

if (number % n == 0) do();

使用低位掩码进行与运算只是混淆,使用现代编译器不会比以可读方式编写代码快。

如果你必须测试所有的情况,你可以通过将一些情况放在 if 中来提高性能:如果被 2 整除,那么测试被 4 整除是没有意义的例如,已经失败了。

关于c++ - 快速整除测试(2、3、4、5、..、16)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6896533/

相关文章:

c++ - 具有模数的boost多精度库不一致

python - 如何减去两个矩形?

c++ - 根据参数的积极性专门化模板

c++ - 类包含其他类问题的字段

c++ - 通过 DEF 文件进行的 DLL 导出符号修改似乎已被修改

c++ - 如何用C连续输出计算开始后的秒数?

c - 在 C 中,如何创建和发送 shell 变量?

c - 如何使用指针数组打印结构实体?

c - 初始化从指针生成整数而不进行强制转换和另外 2 个编译器错误

algorithm - 沿已知轴在外部路径边缘内查找内部路径的位置