C ++:关于插入bitset

时间:2018-01-09 14:51:26

标签: c++

使用STD bitset。我将sting转换为二进制new configuration。如果我这样做就可以了

string myString = "Hi";
for ( int i = 0; i < myString.size(); ++i)
  {
 cout << bitset<8>(myString.c_str()[i]) << endl;
}

如果我这样做就行了

string myString = "Hi";
for ( int i = 0; i < myString.size(); ++i)
  {
 cout << bitset<8>foo(myString.c_str()[i]) << endl;
}

但这不起作用,我想知道为什么

string myString = "Hi";
bitset<8>foo;

for ( int i = 0; i < myString.size(); ++i)
  {
 cout <<foo(myString.c_str()[i]) << endl;
}

我得到no match for call to ‘(std::bitset<8>) (const char&)’

我想我知道如何修复它,但我不明白为什么会这样?声明后无法插入bitset吗?

让我们再试一次,这样的事情会起作用

for (std::size_t i = 0; i < myString.size(); ++i)
  {
   bitset<8>bar(myString.c_str()[i]);
   foo[i] = bar[i];
  }

现在这样可行,但foo中只有8位退出,bar中的所有内容都正确加上我不喜欢它,似乎有很多代码。

我想要的只是声明foo,然后在循环中向它插入位,我缺少什么?我不想使用任何第三方图书馆。

2 个答案:

答案 0 :(得分:4)

使用构造函数创建对象的type(arguments)语法与调用对象的函数或调用操作符的value(arguments)语法之间的区别。< / p>

bitset有一个构造函数,它采用整数类型,但它没有调用操作符。

但是,我不了解总体目标。如果你想写出每个字符的位,第一种方法是有效的。 (第二个片段无法编译。)您希望第三个片段有什么不同?如果你想收集所有字符的所有位,你的bitset就不够大;它只有8位的空间。

在旁注中,s.c_str()[i]是不必要的。使用s[i],或者更好的是,在字符串上使用for-range循环:

for (auto c : myString) {...}

答案 1 :(得分:1)

  

我想转换为base 2然后存储在动态分配中   bitset或矢量。我更喜欢将所有内容保存在bitsets中

     

位集矢量

#include <iostream>
#include <string>
#include <vector>
#include <bitset>

int main()
{
    std::string myString = "Hi";
    std::vector<std::bitset<8>> vec;

    // populate vector
    for (std::bitset<8> foo : myString)
        vec.emplace_back(foo);

    // print vec content
    for (auto const &bits : vec)
        std::cout << bits << std::endl;

    return 0;
}

https://ideone.com/OkAGF2

如果您想将bitset转换为字符串,可以使用bitset .to_string()方法