位到十进制转换的集合
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<<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;
【讨论】:
以上是关于位到十进制转换的集合的主要内容,如果未能解决你的问题,请参考以下文章