我想创建一个简单的程序,它将从输入中获取位数,并作为输出显示二进制数,写在给定位上(例如:我输入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;
}
答案 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_t
或uint64_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;
}