2017-01-20 18 views
0

TL: DR У меня есть 10-битное целое число и хочу, чтобы оно было двоичным числом, хранящимся в массиве.Целое число в двоичном формате, хранящееся в массиве


Допустим, у меня есть Int от 0-1023, и я хочу, что число преобразуется в 10-разрядное двоичное число, которое я тогда поставил в булевой массив. Вот что я сейчас делаю.

void toBinary(bool *binary) 
{ 
    string binaryStr = bitset<10>(myValue).to_string(); //to binary 
    for (int i = 0; i < 10; i++) binary[i] = binaryStr[i] - '0'; 
} 

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

+2

Почему вы преобразования в строку? Почему бы не перейти непосредственно из битового набора в буфер bool? – PaulMcKenzie

+0

@PaulMcKenzie: Это единственный способ узнать. «.to_ulong» на самом деле не сработало хорошо для меня. Вот от чего я хочу избавиться. –

+1

Возможно, вы упустили тот факт, что 'bitset <10>' может быть сохранен в переменной, а затем использовать переменную в цикле? – PaulMcKenzie

ответ

1

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

bitset<10> myBitset(myValue); 
for (int i = 0; i < 10; i++) 
    binary[i] = myBitset[i]; 

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

int mask = 1; // binary 10000000 00000000 ... 
for (int i = 0, l = NUM_BITS; i < l; ++i) { 
    // binary & operation does 
    // AND logic operation for all corresponging bit 
    // so 0010&0011=0010 
    binary[i] = myValue & mask; 
    // move the bits in mask one to the right 
    mask = mask>>1; 
} 

Если вы собираетесь с BitSet, я рекомендую вам сохранить BitSet вместо использования bool*, потому что в битах каждый бит фактически занимает один бит, тогда как bool - это по меньшей мере восемь бит.

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

#include <iostream> 
#include <bitset> 
#define NUM_BITS 10 
int main(int argc, char *argv[]) 
{ 
    const int numBits = NUM_BITS; 
    bool binary[numBits]; 
    const int myValue = 1; 

    std::bitset<NUM_BITS> myBitset(myValue); 
    //for (int i = 0; i < NUM_BITS; i++) 
     //binary[i] = myBitset[i]; 

    for (int i = 0, l = NUM_BITS; i < l; ++i) { 
     std::cout<< (binary[i]?'1':'0')<<" "; 
    } 
    std::cout<<"\n"; 
    int mask = 1; // binary 10000000 00000000 ... 
    for (int i = 0, l = NUM_BITS; i < l; ++i) { 
     // binary & operation does 
     // AND logic operation for all corresponging bit 
     // so 0010&0011=0010 
     binary[i] = myValue & mask; 
     // move the bits in mask one to the right 
     mask = mask>>1; 
    } 

    for (int i = 0, l = NUM_BITS; i < l; ++i) { 
     std::cout<< (binary[i]?'1':'0')<<" "; 
    } 
} 
+0

Я использую bool, потому что мне нужно будет использовать их в качестве состояний GPIO. Спасибо за ваш ответ, хотя :) –