我有一个bool列表,我正在尝试将其转换为一个_int64。 bools列表由8个字符的字符串创建,因此它永远不会超过64的长度。
我试过这样做:
我传递了一个const std :: list<布尔>& binList进入函数。
_int64 x = 0;
for(auto citer = binList.begin();citer!=binList.end();citer++{
x*=10;
if(*citer) x++;
}
这显然不起作用,因为如果有一个0的列表,int将永远不会变大,但我得到的输出甚至不包含1和0。它包含随机数。不太确定最好的方法。提前谢谢。
问一个例子,所以这里有一个: binList包含:
{0,1,1,0,1,0,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0, 1,1,0,0,0,1,1,0,1,1,1,1,1}
当我通过该循环运行时,x = -3830736327776896713。
如果不清楚,我会像x一样包含01101000011001011000110110001101111。
答案 0 :(得分:1)
您将通过乘以10转移到循环中的下一个基数为10的数字,您应该通过乘以2来转移到下一个位。
你的奇怪结果可能是由溢出造成的,再加上你将它显示为基数为10而不是二进制的事实。
如果您的意图是将每个基数为10的数字用作0或1,那么您将只能保持19位。
答案 1 :(得分:1)
E.g:
for(auto citer = binList.begin();citer!=binList.end();citer++){
x <<= 1;
if (*citer) x |= 1;
}
也许最好让int unsigned。
答案 2 :(得分:1)
只需遍历布尔数组并打开i'th
位,找到布尔数组中的1
。
以下程序将布尔数组转换为单个64位整数。
#include<iostream>
using namespace std;
int turnOnBit(int N,int pos)
{
return N=N | (1<<pos);
}
int main()
{
bool ar[] = {0,1,1,0,1,0,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,1,1};
__int64 x;
for(int i = 0; i < sizeof(ar); i++)
{
if(ar[i])
turnOnBit(x,i);
}
cout<<x<<endl;
return 0;
}