【问题标题】:C++ How can I assign an input value to a std::bitset argument?C++ 如何将输入值分配给 std::bitset 参数?
【发布时间】:2017-03-01 15:43:03
【问题描述】:

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

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

【问题讨论】:

  • Convert integer to bits的可能重复
  • 该问题的答案取决于编译时已知的数字。不适合 OP 的需要。
  • 除非您需要使用std::bitset,否则您可以使用stackoverflow.com/questions/23173261/…中的解决方案。
  • 我想尝试一下简单的方法。我可以通过其他方式做到这一点。我只是想知道是否有一个小故障可以让它工作

标签: c++ bitset std-bitset


【解决方案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

【讨论】:

  • 谢谢你,我想我明白了,但你能告诉我在前导 0 时如何限制我的输出?
  • 所以你不想显示前导零?你可能想问一个不同的问题(除非你自己想办法)。
  • 我的意思是我这样做,但只是为了有限的价值。例如,我不想在 64 位上显示数字,而是在 10 上显示数字
  • 我的问题涉及您的陈述“您需要另一个整数来限制您的输出”。我不知道如何实现它
  • 好的!一开始没看懂。更新了我的答案。
【解决方案2】:

你必须定义 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;
}

【讨论】:

  • 这不是我遇到的问题。我希望能够在我的键盘上输入位数。
  • 模板参数必须在编译前定义。
猜你喜欢
  • 2019-10-24
  • 1970-01-01
  • 2020-02-24
  • 1970-01-01
  • 2017-05-17
  • 2022-11-27
  • 1970-01-01
  • 2012-07-21
  • 2013-11-20
相关资源
最近更新 更多