位到十进制转换的集合

Collection of bits to decimal conversion

本文关键字:集合 转换 十进制      更新时间:2023-10-16

要求可能是唯一的或过时的,但谷歌的最后两个小时没有给出答案。

我有一个第三路径组件,它以二进制形式返回给我一个数据。以下是示例:

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"布尔值的集合转换为"long"。

以下是例外:

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

这个解决方案怎么样?

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;
}

假设您首先得到的是最低的位。

只要积累答案,在每一个新的比特中转换。

您可以使用算术运算符或逻辑运算符来完成此操作。逻辑运算符更干净,但算术可能更容易阅读和维护。

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

long result = 0;

然后,在循环中,在返回Val后,执行以下任一操作:

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

result = result<<1 | (returnVal? 1 : 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;
}