所以我正在看一个下载地图图块的程序。从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;
}
在同一网站上,它声明用于解决这个问题的数学是:
其中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)
。
答案 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