代码之家  ›  专栏  ›  技术社区  ›  David

将整数转换为笛卡尔坐标的其他/更快的方法?

  •  4
  • David  · 技术社区  · 17 年前

    所以我很好奇,有没有其他可能更快的算法来将整数转换成坐标点?

    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的造型问题,我把它剪掉了。
    5 回复  |  直到 17 年前
        1
  •  7
  •   Adam Davis    17 年前

    哦,是的!这是一个完美的二进制示例:

    function int2coord($i){
        $x = $i >> 3;
        $y = $i & 0x07;      
        return array($x, $y);
    }
    

    它之所以有效,是因为任何二进制除以8等于右移3位。现代处理器具有桶形移位器,可以在一条指令中进行多达32位的移位。

    反之亦然:

    function coord2int($x, $y){
       return ($x << 3)+$y;
    }
    

        2
  •  3
  •   cg.    17 年前

    我现在没有时间自己来衡量这一点,但我怀疑预先计算的查找表在速度上会超过您的解决方案。代码如下所示:

    class Converter  {
        private $_table;
    
        function __construct() 
        {
            $this->_table = array();
            for ($i=0; $i<64; $i++) {
                $this->_table[$i] = array( (int)($i/8), (int)($i%8) ); 
            }
        }
    
        function int2coord( $i )
        {
            return $this->_table[$i];
        }
    }
    
    $conv = new Converter(); 
    $coord = $conv->int2coord( 42 );
    

    当然,这确实增加了很多开销,所以在实践中,如果调用了转换代码,您只需预先计算所有坐标 非常 经常

        3
  •  1
  •   mwigdahl    17 年前

    我现在无法测量,但您应该能够通过以下方式来弥补一些额外的速度:

    function int2coord($i){
      $y = $i%8;
      $x = (int)($i/8);
      return array($x, $y);
    }
    

        4
  •  1
  •   user61975 user61975    17 年前
    function int2coord_3($i){
        return array((int) ($i / 8), ($i % 8));
    }
    

    这要快一点,因为没有var声明和矫揉造作。

        5
  •  1
  •   Ron    17 年前

    我认为在最后返回数组(…)会损失大部分性能。相反,我建议:
    *定义两个函数,一个用于x,一个用于y


    推荐文章