目标c:使用Integers进行二进制操作?

时间:2011-08-03 08:50:49

标签: objective-c c xcode binary bit-shift

我有关于以下代码段的 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 ......)并合并这些基于十六进制的数字?

2 个答案:

答案 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运算符。

  1. 第3行将tile.zoom的LSB分配给zoom(modulu 0x100)
  2. 第4行将tile.x的28个最低有效位分配给x(modulu 0x10000000)
  3. 第5行为第4行。

  4. 第7行将通过将所有上述变量放在key的不同位(偏移)中来构造关键变量。