240 发简信
IP属地:江西
  • 我是你参考的那篇文章的作者 shines77,很荣幸搜到了你的文章,最近才发现,我以前的写的有一个漏洞,就是例如:uint32_t i = num / 7; 除数为 7, 14, 19, 21 等数的时候,计算出来的相乘系数M是不对的,需要修正。

    比较正确的做法是,和编译器的做法一致:https://zhuanlan.zhihu.com/p/151038723

    我在写:https://github.com/shines77/ArrayRotate 的时候发现了这个问题,并且做了修正,但是我的做法更测底一点,比编译器的做法更好,对于 7, 14, 19, 21 这种情况,编译器需要6条指令,我的做法只需要4条指令,最关键的是可以省掉两种情况的 if 判断。

    具体的做法可以参考(这次我做得比较全面,希望不要留下bug,持续在改进中):

    https://github.com/shines77/ArrayRotate/blob/master/src/jstd/FastDiv.h
    或者
    https://gitee.com/shines77/ArrayRotate/blob/master/src/jstd/FastDiv.h

    由于代码越来越臃肿,FastDiv.h 和 FastMod.h 可能会重新另建一个单独的仓库。

  • 32位编译器整型乘除法优化

    乘法 乘法指令 mul ;无符号乘法 imul ;有符号乘法 常量 * 常量:在编译期就被编译器优化了,不会调用乘法指令,直接将运算结果赋予存放结果的内存 变量 * 变...