2016-01-05 4 views
-3

Требование может быть уникальным или устаревшим, но последние 2 часа google не дает мне ответ.Сбор бит до десятичной конверсии

У меня есть один третий компонент пути, который возвращает мне данные в двоичном Ниже приведен пример:

long GetMyData() 
{ 
    for(int index = 0; index < CollectionOfEntity.GetCount(); index++) 
    { 
     CString EntityName = CollectionOfEntity.GetAt(index); 
     BOOL returnVal; 
     //Get data from binary format 
     hr = EntityInterface->GetDataInBit(EntityName, returnVal, FALSE);   
    } 
    //Return all combine data into long. 
} 

нужно преобразовать коллекцию «ReturnVal» логическое значение для «длинных».

Ниже исключение:

  • Я не хочу, чтобы преобразовать двоичные данные в строку, а затем двоичную строку в десятичное. это создаст огромную задержку в выполнении моего процесса.
+2

Зачем это связано [Метка: C]? – YSC

+0

@YSC решение в C также принимаем. –

+1

@SantoshDhanawade Что касается переключения и/или возврата 'returnVal' в конечный желаемый« длинный »результат? Ваш вопрос немного нечетко о ожидаемом выходе. –

ответ

2

Что касается этого решения?

long GetMyData() { 
    long result = 0; 
    for(int index = 0; index < CollectionOfEntity.GetCount(); index++) { 
     CString EntityName = CollectionOfEntity.GetAt(index); 
     BOOL returnVal; 
     //Get data from binary format 
     hr = EntityInterface->GetDataInBit(EntityName, returnVal, FALSE);  
     result |= returnVal << index; // <<<<<<<<< 
    } 
    return result; 
} 
+0

«i» должен быть индексом справа? –

+0

@SantoshDhanawade Конечно, извините. –

0

Предполагая, что вы сначала получаете бит.

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

Вы можете сделать это с помощью арифметических или логических операторов. Логические операторы более чисты, но вам может быть легче читать и поддерживать арифметику.

В обоих случаях перед циклом имеют:

long result = 0;

Затем внутри цикла, после того, как у вас есть ReturnVal, сделать что-либо:

result = result*2 + (returnVal? 1 : 0);

или

result = result<<1 | (returnVal? 1 : 0);

Как только вы поймете это, вы можете сделать чистый код (но менее читаемым для новичка) двумя способами:

  • Удалите скобки вокруг конечного срока. Они не нужны.
  • Заменить оператора ? .. : литой.
0

Предполагая, что вы не имеете размер длинного бита и его в правильном порядке. Что-то вроде этого может работать (непроверено).

long GetMyData() 
{ 
    long res = 0; 
    for(int index = 0; index < CollectionOfEntity.GetCount(); index++) 
    { 
     CString EntityName = CollectionOfEntity.GetAt(index); 
     BOOL returnVal; 
     //Get data from binary format 
     hr = EntityInterface->GetDataInBit(EntityName, returnVal, FALSE);   
     res |= (returnVal << index); 
    } 
    //Return all combine data into long. 
    return res; 
} 
Смежные вопросы