要求可能是唯一的或过时的,但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”。
以下是例外:
答案 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;
}