Those Magic Optimizations

记录一些魔术、魔数和编译器优化指令。

速查手册,长期更新。

除法变乘法

怕不是最常见的一种优化操作了。

关键字:GCC,G++,ARM64,除法,0xAAAAAAAAAAAAAAAB 用法:result = -6148914691236517205LL * x; 等价:result = x/3 限制:64bit 要求:x%3==0,否则会产生一个超大的结果;

比如:

  • 常数是0xAAAAAAAAAAAAAAAB
  • 在64bit下,0xAAAAAAAAAAAAAAAB*6=2
  • 上述数值去掉一个A,就把运算空间限制到了63bit(也就是做有符号计算),但是作用似乎不大

同类常数还有:

  • 0xAAAAAAAAAAAAAAAB -> /3
  • 0xAAAAAAAAAAAAAAAC -> /4
  • 0xCCCCCCCCCCCCCCCD -> /5
  • 0xE1BFE31AA3715387 -> /567

参考在此

跳转表

这个……应该没有什么说的意义吧,密集+稀疏两种策略。