2016-05-04 6 views
1

Есть ли быстрый способ преобразования массива uint8_t в biteset.преобразовать массив uint8_t в биты в C++

uint8_t test[16]; 
// Call a function which populates test[16] with 128 bits 
function_call(& test); 
for(int i=0; i<16; i++) 
    cout<<test[0]; // outputs a byte 
cout<<endl; 
std:: bitset<128> bsTest; 

Я попытался это, но не работает

bsTest(test); 
+0

работает для меня. – DeiDei

+0

Я получаю эту ошибку "error: no match for call to" (std :: bitset <128ul>) (uint8_t [16]) '" –

+0

@DeiDei: Он будет« работать »в том смысле, что если' test' был обнулен, некоторые компиляторы могут использовать конструктор, основанный на строках, определить, что это пустая строка (первый байт - «NUL'), и нуль« биттет »; совпадение корректно, если 'test' обнуляется, но ошибочно во всех остальных случаях. – ShadowRanger

ответ

1

Я предлагаю вам возможное решение.

Не очень хорошо, не так быстро, немного грязно, но я надеюсь, что это может помочь.

#include <bitset> 
#include <iostream> 

int main() 
{ 
    uint8_t test[16] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 
         'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p' }; 

    std::bitset<128> bsTest { } ; 

    for (unsigned ui = 0 ; ui < 16 ; ++ui) 
    { 
     bsTest <<= 8; 

     std::bitset<128> bsTmp { (unsigned long) test[ui] }; 

     bsTest |= bsTmp; 
    } 

    std::cout << bsTest; 

    return 0; 
} 

Идея заключается в инициализации BitSet к нулю

std::bitset<128> bsTest { } ; 

и добавить uint8_t в то время, в конце другого BitSet

std::bitset<128> bsTmp { (unsigned long) test[ui] }; 

затем объединить (бит или) два биты

bsTest |= bsTmp; 

и сдвиг 8 бит результат

bsTest <<= 8; 

p.s .: извините за мой плохой английский штрафа

+0

Спасибо большое! Сейчас это работает для меня. Я посмотрю, смогу ли я сделать это быстрее. Кстати, ваш английский так же хорош (или лучше) мой :) –

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