我试图将一个objective-c项目转换为c#.net,几个月前它工作得很好,但现在我更新了一些东西,它给了我不好的价值。也许你会看到我做错了什么。
这是来自https://github.com/magiconair/map2sqlite/blob/master/map2sqlite.m的原始函数
uint64_t RMTileKey(int tileZoom, int tileX, int tileY)
{
uint64_t zoom = (uint64_t) tileZoom & 0xFFLL; // 8bits, 256 levels
uint64_t x = (uint64_t) tileX & 0xFFFFFFFLL; // 28 bits
uint64_t y = (uint64_t) tileY & 0xFFFFFFFLL; // 28 bits
uint64_t key = (zoom << 56) | (x << 28) | (y << 0);
return key;
}
我的错误 .net 版本:
public UInt64 RMTileKey(int tileZoom, int tileX, int tileY)
{
UInt64 zoom = (UInt64)tileZoom & 0xFFL; // 8bits, 256 levels
UInt64 x = (UInt64)tileX & 0xFFFFFFFL; // 28 bits
UInt64 y = (UInt64)tileY & 0xFFFFFFFL; // 28 bits
UInt64 key = (zoom << 56) | (x << 28) | (y << 0);
return key;
}
参数为:tileZoom = 1, tileX = 32, tileY = 1012
UInt64 键 = (缩放 << 56) | (x << 28) | (y << 0); 给了我一个难以置信的大数字。
准确地说:
如果缩放 = 1,它会给我缩放 << 56 = 72057594037927936
如果 x = 32,它给我 (x << 28) = 8589934592
也许 0 是之前的结果?
我检查了文档http://msdn.microsoft.com/en-us/library/f96c63ed(v=vs.110).aspx说:
如果类型是无符号的,则将它们设置为 0。否则,它们将填充符号位的副本。对于没有溢出的左移运算符,语句
就我而言,似乎在使用无符号类型时出现溢出,或者我的 .net 转换不好?