Цель c: бинарные операции с целыми числами? - PullRequest
0 голосов
/ 03 августа 2011

У меня 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). Оператор & делает то, что с моим uint64_t. Я предполагаю, что это преобразование в шестнадцатеричное значение? А затем в строке 7 я перехожу с бита 0 на 27 (с 28 на 56 ...) и объединяю эти числа на основе шестнадцатеричных чисел?

Ответы [ 2 ]

3 голосов
/ 03 августа 2011

строка 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
0 голосов
/ 03 августа 2011

Первый - & - это двоичный оператор AND.| является двоичным оператором ИЛИ.

  1. Строка 3 назначит младший бит tile.zoom на zoom (который является модулем 0x100)
  2. Строка 4 назначит 28младшие значащие биты от tile.x до x (который является модулем 0x10000000)
  3. Строка 5 как строка 4.

  4. Строка 7 создаст ключпеременной, помещая все вышеупомянутые переменные в разные биты (смещения) key.

...