C ++如何为std :: bitset参数分配输入值?

时间:2016-10-19 20:25:26

标签: c++ bitset std-bitset

我想创建一个简单的程序,它将从输入中获取位数,并作为输出显示二进制数,写在给定位上(例如:我输入3:它显示000,001,010,011 ,100,101,110,111)。 我得到的唯一问题是第二个 for -loop,当我尝试在 bitset< > 中分配变量时,它想要常数。 如果你能帮我找到解决方案,我会非常感激。 这是代码:

#include <iostream>
#include <bitset>
#include <cmath>

using namespace std;

int main() {
    int maximum_value = 0,x_temp=10;
    //cin >> x_temp;
    int const bits = x_temp;

    for (int i = 1; i <= bits; i++) {
        maximum_value += pow(2, bits - i);
    }
    for (int i = maximum_value; i >= 0; i--)
        cout << bitset<bits>(maximum_value - i) << endl;
    return 0;
}

2 个答案:

答案 0 :(得分:1)

数字(“非类型”,如C ++调用它)模板参数必须是编译时常量,因此您不能使用用户提供的数字。改为使用大的常数(例如64)。您需要另一个限制输出的整数:

int x_temp = 10;
cin >> x_temp;
int const bits = 64;
...

这里64是你可以使用的某种最大值,因为bitset有一个unsigned long long参数的构造函数,它有64位(至少;可能更多)。

但是,如果使用int进行中间计算,则代码最多可以支持14位(无溢出)。如果您想支持超过14位(例如64位),请使用更大的类型,例如uint32_tuint64_t

保持比所需位数多的问题是将显示附加位。要删除它们,请使用substr

cout << bitset<64>(...).to_string().substr(64 - x_temp);

此处to_string将其转换为包含64个字符的字符串,substr剪切最后一个字符,其编号为x_temp

答案 1 :(得分:0)

你必须定义const int bits = 10;作为一个全球常数:

#include <iostream>
#include <math.h>
#include <bitset>

using namespace std;
const unsigned bits=10;
int main() {
    int maximum_value = 0,x_temp=10;

    for (int i = 1; i <= bits; i++) {
        maximum_value += pow(2, bits - i);
    }
    for (int i = maximum_value; i >= 0; i--)
        cout << bitset<bits>(maximum_value - i) << endl;
    return 0;
}

enter image description here