4

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

#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;
}
4

2 回答 2

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_tor uint64_t


保存比需要更多的位的问题是将显示额外的位。要删除它们,请使用substr

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

这里to_string将其转换为 64 个字符的字符串,并substr剪切最后一个字符,其编号为x_temp.

于 2016-10-19T20:39:01.060 回答
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;
}

在此处输入图像描述

于 2016-10-19T20:45:16.097 回答