Как работать с битовыми полями длиннее 64 бит? - PullRequest
7 голосов
/ 15 ноября 2011

Вопрос говорит сам за себя.

Если у меня есть это для 96-битного поля:

uint32_t flags[3]; //(thanks @jalf!)

Как мне лучше всего получить доступ к этому, учитывая, что мои подполя в нем могут лежатьза 32-битными границами (например, поле, которое запускается с бита 29 до 35)?

Мне нужно, чтобы мои обращения были максимально быстрыми, поэтому я бы предпочел не выполнять итерации по ним как 32-битныеэлементы массива.

Ответы [ 3 ]

10 голосов
/ 15 ноября 2011

STL содержит класс для работы с битовыми полями произвольной длины :

#include <bitset>

int main() {
  const bitset<12> mask(2730ul); 
  cout << "mask =      " << mask << endl;

  bitset<12> x;

  cout << "Enter a 12-bit bitset in binary: " << flush;
  if (cin >> x) {
    cout << "x =        " << x << endl;
    cout << "As ulong:  " << x.to_ulong() << endl;
    cout << "And with mask: " << (x & mask) << endl;
    cout << "Or with mask:  " << (x | mask) << endl;
  }
}
6 голосов
/ 15 ноября 2011

[Этот ответ действителен для C (и, соответственно, также для C ++).]

Независимый от платформы способ заключается в применении битовых масок и битовых сдвигов в зависимости от ситуации.

Таким образом, чтобы получить ваше поле от 29 до 35 (включительно):

  (flags[1] & 0xF)        << 3
| (flags[0] & 0xE0000000) >> 29  // The bitmask here isn't really needed, but I like symmetry!

Очевидно, вы могли бы написать класс / функцию / макрос для автоматизации этого.

0 голосов
/ 15 ноября 2011

Нет проблем с битовыми полями, превышающими 64 бита. Они могут быть даже намного больше, чем у вас!

Проблема, которую я вижу, заключается в том, что вы обращаетесь к членам, которые пересекают 32-битную границу. Это больше проблема. Но, честно говоря, на 64-битных платформах, если вы используете long long для создания типов битовых полей, вам нужно быть осторожным только на 64-битных границах.

Если ваша мотивация - сделать ваш доступ "как можно быстрее", подумайте дважды, прежде чем пытаться быть умнее компилятора. В настоящее время они могут оптимизировать, о чем вы даже не подозреваете. Моя лучшая рекомендация: держать код легко читаемым и понятным.

...