【问题标题】:Convert a list of bools into an _int64将布尔列表转换为 _int64
【发布时间】:2016-03-09 23:28:56
【问题描述】:

我有一个布尔列表,我正在尝试将其转换为一个 _int64。布尔列表是由 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。

【问题讨论】:

  • 您没有向我们展示足够的相关代码来确定问题所在。请努力将您的问题代码减少到 Minimal, Complete, Verifiable Example 并将其包含在您的帖子中。

标签: c++ list boolean


【解决方案1】:
  1. 左移
  2. 相应地切换最后一位。

例如:

for(auto citer = binList.begin();citer!=binList.end();citer++){
    x <<= 1;
    if (*citer) x |= 1;
}

也许最好让 int 无符号。

【讨论】:

  • 或者第二行可以简单地是x += *citer;
【解决方案2】:

您通过乘以 10 转移到循环中的下一个 base-10 数字,您应该通过乘以 2 转移到下一个

您的奇怪结果可能是由溢出引起的,而且您将其显示为以 10 为底的数字而不是二进制。

如果您真的打算将每个以 10 为底的数字用作 0 或 1,那么您将只能以这种方式保存 19 位。

【讨论】:

    【解决方案3】:

    只需遍历布尔数组并打开您在布尔数组中找到1i'th 位。

    以下程序将布尔数组转换为单个 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-12-22
      • 1970-01-01
      • 2017-04-15
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2020-06-26
      • 2016-04-14
      • 2021-09-07
      相关资源
      最近更新 更多