将经度和纬度映射到MapTile坐标的方法使用<<操作者

时间:2015-01-20 15:35:44

标签: c# operators bit-shift

所以我正在看一个下载地图图块的程序。从here开始,我有一个c#方法,用于从经度和纬度点获取切片网格坐标,如下所示:

public PointF WorldToTilePos(double lon, double lat, int zoom)
{
    PointF p = new PointF();
    p.X = (float)((lon + 180.0) / 360.0 * (1 << zoom));
    p.Y = (float)((1.0 - Math.Log(Math.Tan(lat * Math.PI / 180.0) + 
        1.0 / Math.Cos(lat * Math.PI / 180.0)) / Math.PI) / 2.0 * (1 << zoom));

    return p;
}

在同一网站上,它声明用于解决这个问题的数学是: enter image description here

其中z = zoom。

现在我的问题是&lt;&lt;运算符do和(1&lt;&lt; zoom)意味着什么。因为据我所知,c#方法不正确,(1&lt;&lt; zoom)应该替换为x中的Math.Pow(2,zoom);和y中的Math.Pow(2,zoom-1)

3 个答案:

答案 0 :(得分:3)

它是一个左移算子。它将数字1中的位向左移动zoom个位数。

在此1 << zoom的上下文中,它基本上创造了2的幂。

如果缩放等于3,则其执行2^3

0000 0001 = 1
After executing 1 << zoom (3)
0000 1000 = 8

正如您所指出的,您可以将其替换为Math.Pow,但是,位操作要快得多。 Math.Pow必须在一般情况下处理问题,处理部分权力和其他问题。位操作是自然的CPU操作,在单个CPU周期中执行。

答案 1 :(得分:1)

<<是一个移位运算符。

考虑二进制数00001110(十进制14)。当它向左移位1时,它变为00011100(十进制28)。当向右移位1时,后者再次变为00001110(十进制14)。

通常,将整数乘以1会导致乘以2(向左移位时)或整数除以2(向右移位时)。

位移2(即,位移1,两次)会导致乘以2 * 2或整数除以2 * 2.

在一般情况下,将数字移位N会导致乘法或除以2 ^ N.

答案 2 :(得分:-1)

它向左移动一个缩放次数。这实际上与将变焦功率提高2相同。

对于y,它通过除以2来实现z-1