位到十进制转换的集合

时间:2016-01-05 10:30:42

标签: c++ visual-c++ mfc binary

要求可能是唯一的或过时的,但google的最后2小时未给予回答。

我有一个第三个路径组件,它返回二进制数据,例如:

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”bool值的集合转换为“long”。

以下是例外:

  • 我不想将二进制数据转换为字符串,然后将二进制字符串转换为十进制。这将在我的流程执行中造成巨大延迟。

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

假设您首先获得最低位。

只需积累答案,转移每个新位。

您可以使用算术运算符或逻辑运算符执行此操作。逻辑运算符更清晰,但运算可能更容易阅读和维护。

在这两种情况下,循环之前都有:

long result = 0;

然后,在循环内部,在returnVal之后,执行以下任一操作:

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

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

一旦理解了这一点,就可以通过两种方式使代码更清晰(但对新手来说不太可读):

  • 删除最后一个术语的括号。它们不是必需的。
  • ? .. :运算符替换为强制转换。

答案 2 :(得分: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;
}