Правильно ли я извлекаю эти поля с помощью побитового сдвига?(тег, индекс, смещение) - PullRequest
1 голос
/ 16 ноября 2011

Я создаю эмулятор кэша ЦП на C. Я надеялся, что вы подскажете мне, правильно ли я извлекаю эти поля:

32-битный адрес должен быть разбит следующим образом:

+---------------------------------------------------+
| tag (20 bits) | index (10 bits) | offset (2 bits) |
+---------------------------------------------------+

Вот мой код для получения значений для каждого:

void extract_fields(unsigned int address){

   unsigned int tag, index, offset;

   // Extract tag
   tag = address >> 12;

   // Extract index
   index = address << 20;
   index = index >> 22;

   // Extract offset
   offset = address << 30;
   offset = offset >> 30;

}

Любой совет очень ценится!

1 Ответ

2 голосов
/ 16 ноября 2011

Похоже, ваше решение работает, но часто оно выполняется другим способом, который, возможно, немного более понятен.

Для вашего примера:

// Shift off the lowest 12 bits, and mask off the higher ones
tag = (address >> 12) & 0xFFFFF; 

// Shift off the lowest 2 bits, and mask off the higher ones
index = (address >> 2) & 0x3FF;

// Shift off the lowest 0 bits, and mask off the higher ones
offset = (address >> 0) & 0x3;
...