2013-05-25 2 views
4

У меня есть довольно большой BitSet:BITSET разделить на голец

bitset<128*8> bs; 

я хотел бы иметь доступ к группам по 8 бит. А что хотя до сих пор:

  1. bs.to_string()
  2. раскола в вектор строки размера 8
  3. создать новый BitSet из этих строк и вызовите to_ulong()

Есть ли лучшее решение? Производительность имеет решающее значение, поскольку я вызываю этот метод несколько раз в своей программе.

+0

После некоторого рудиментарного поиска в Google я бы предложил написать собственный класс-оболочку (возможно, полученный из 'bitet'), который поддерживает char-wise-доступ. – phimuemue

+0

Почти похоже на то, что вы хотите 'char []' (или 'std :: array '). – Dukeling

+0

'std :: vector (128)'? –

ответ

2

std::bitset имеет оператора >>.

Если вы хотите получить доступ к значению и прочитать его, вы можете использовать нижеприведенный код. Он читает N й 8 бит как uint8_t:

bitset<128*8> mask(0xFF); 
uint8_t x = ((bs >> N * 8) & mask).to_ulong(); 
+0

, не будет ли это переполнение? –

+0

to_ulong генерирует исключение переполнения, если битсет не может быть выражен в unsigned long. –

+0

@BartlomiejLewandowski: Umm, как насчет этой обновленной версии :-) – deepmax

1

Вы можете сделать что-то вроде этого, чтобы избежать создания строк и некоторое копирование:

for (uint32_t i = 0; i < bs.size(); i+=8) { 
    uint32_t uval = 0; 
    for (uint32_t j = 0; j < 8; j++) { 
     uval = (uval << 1) + bs[i + 7 - j]; 
    } 
    std::cout << uval << std::endl; 
} 

но вы, возможно, придется работать на индексы в зависимости на вашем контенте

Смежные вопросы