位到十进制转换的集合

Posted

技术标签:

【中文标题】位到十进制转换的集合【英文标题】:Collection of bits to decimal conversion 【发布时间】:2016-01-05 10:30:42 【问题描述】:

要求可能是唯一的或过时的,但过去 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”布尔值的集合转换为“long”。

以下是例外:

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

【问题讨论】:

为什么标记为c? @YSC C 中的解决方案也被接受。 @SantoshDhanawade 将returnVal 转换为最终所需的long 结果怎么样?您的问题对预期的输出有点不清楚。 如果您想要一个可以同时使用两种语言的解决方案,如您的问题所示,不要求仅使用 C++ 函数怎么样? @SantoshDhanawade Solution in C also accepted ... I want solution in one language only. ... 如果你连自己想要什么都不知道,我们怎么知道? 【参考方案1】:

这个解决方案怎么样?

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;

【讨论】:

@SantoshDhanawade 当然,对不起。【参考方案2】:

假设您首先获得最低位。

只需累积答案,在每个新位中移动。

您可以使用算术或逻辑运算符来做到这一点。逻辑运算符更简洁,但算术可能更易于阅读和维护。

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

long result = 0;

然后,在循环中,在你有 returnVal 之后,执行以下任一操作:

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

result = result&lt;&lt;1 | (returnVal? 1 : 0);

一旦您理解了这一点,您可以通过两种方式使代码更简洁(但对新手来说可读性较差):

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

【讨论】:

【参考方案3】:

假设您没有超过 long 位的大小并且它的顺序正确。 像这样的东西可能会起作用(未经测试)。

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;

【讨论】:

以上是关于位到十进制转换的集合的主要内容,如果未能解决你的问题,请参考以下文章

进制转换与原码补码

进制转换与原码补码

BitArray类的使用--(转换二进制数的内部实现过程)

LeetCode67. 二进制求和

C语言 判断一个数的二进制数第7位是不是为1

Python函数:内置函数(数学运算函数类型转换函数)