作为一个有趣的侧面项目,我自己帮助学习另一个PHP MVC框架,我一直在编写Reversi/Othello作为PHP和Ajax应用程序,大多是简单的东西.我决定不使用多维数组有很多原因,而是有一个线性数组(在这种情况下是64个元素长)和几个从坐标转换为整数的方法.
所以我很好奇,有没有其他可能更快的算法将整数转换为坐标点?
function int2coord($i){ $x = (int)($i/8); $y = $i - ($x*8); return array($x, $y); } //Not a surprise but this is .003 MS slower on average function int2coord_2($i){ $b = base_convert($i, 10, 8); $x = (int) ($b != 0 ? $b/8 : 0); // could also be $b < 8 for condition $y = $b % 10; return array($x, $y); }
为了后人的缘故,我为coord2int写的方法
function coord2int($x, $y){ return ($x*8)+$y; }
更新:
所以在奇怪的土地上,结果不是我所期待的,但使用预先计算的查找表主要表现为最快,猜测交易记忆速度总是赢家?
这里有一张桌子,但由于SO的样式问题,我把它剪掉了.
Adam Davis.. 7
哦,是的!这是二进制的完美示例:
function int2coord($i){ $x = $i >> 3; $y = $i & 0x07; return array($x, $y); }
实际情况是,一个好的编译器会找到这个优化并使用它,所以它不一定更快.测试并查看您的编译器/解释器是否执行此操作.
它的工作原理是因为任何二进制除以8与右移三位相同.现代处理器具有桶形移位器,可在一条指令中进行高达32位的移位.
反过来也很简单:
function coord2int($x, $y){ return ($x << 3)+$y; }
-亚当
哦,是的!这是二进制的完美示例:
function int2coord($i){ $x = $i >> 3; $y = $i & 0x07; return array($x, $y); }
实际情况是,一个好的编译器会找到这个优化并使用它,所以它不一定更快.测试并查看您的编译器/解释器是否执行此操作.
它的工作原理是因为任何二进制除以8与右移三位相同.现代处理器具有桶形移位器,可在一条指令中进行高达32位的移位.
反过来也很简单:
function coord2int($x, $y){ return ($x << 3)+$y; }
-亚当