我有关于以下代码段的 BASIC 逻辑问题:
1 uint64_t RMTileKey(RMTile tile)
2 {
3 uint64_t zoom = (uint64_t) tile.zoom & 0xFFLL; // 8bits, 256 levels
4 uint64_t x = (uint64_t) tile.x & 0xFFFFFFFLL; // 28 bits
5 uint64_t y = (uint64_t) tile.y & 0xFFFFFFFLL; // 28 bits
6
7 uint64_t key = (zoom << 56) | (x << 28) | (y << 0);
8
9 return key;
10 }
返回值键是无符号整数。 我现在很困惑,因为我不明白第3行(4,5)发生了什么。运营商&amp;用我的uint64_t做什么。我想它正在转换为十六进制值? 然后在第7行,我从第0位转到第27位(28到56 ......)并合并这些基于十六进制的数字?
答案 0 :(得分:3)
第3行:zoom
包含除0到7之外的所有位清除:0000...000zzzzzzzz
8位
第4行:x
包含除0到27之外的所有位:0000...000xxxx...xxxx
; 28位
第5行:y
包含除0到27之外的所有位:0000...000yyyy...yyyy
; 28位
第7行:重新排列这些位以产生一个64位值:
,--------------------- bit 56 / ,----------- bit 28 / / ,- bit 0 zzzzzzzzxxxx...xxxxyyyy...yyyy zoom<<56 x<<28 y<<0
答案 1 :(得分:0)
首先 -
&
是二元AND运算符。
|
是二元OR运算符。
tile.zoom
的LSB分配给zoom
(modulu 0x100)tile.x
的28个最低有效位分配给x
(modulu 0x10000000)第5行为第4行。
第7行将通过将所有上述变量放在key
的不同位(偏移)中来构造关键变量。