2010-08-16 116 views
2

我转换角色使用std::bitset<CHAR_BIT> binary('c'); 为二进制,但这并不对字符串工作,字符串为二进制

std::string str = "MyString"; 
std::bitset<SIZE_OF_STRING_IN_BITS> binary(str); //Error Exception 

应该是什么办法呢?

回答

1

你可以重复这个动作在字符串的每个字符,由CHAR_BIT移位集左侧每次:

#include <bitset> 
#include <string> 
#include <iostream> 
#include <numeric> 
#include <climits> 
template<size_t N> 
std::bitset<N> string_to_bitset(const std::string& s) 
{ 
    return accumulate(s.begin(), s.end(), std::bitset<N>(), 
      [](const std::bitset<N>& l, char r) 
      { 
       return std::bitset<N>(r) | l<<CHAR_BIT; 
      }); 
} 
int main() 
{ 
    std::string str = "MyString"; 
    const size_t SIZE_OF_STRING_IN_BITS = CHAR_BIT * 8; 
    std::bitset<SIZE_OF_STRING_IN_BITS> binary = string_to_bitset<SIZE_OF_STRING_IN_BITS> (str); 
    std::cout << binary << '\n'; 
} 

看到,因为bitset的大小必须是常量表达式,我会除非该字符串是编译时常量,否则请与boost::dynamic_bitset一起去。

+0

巧妙使用模板参数。但是,这只适用于编译时已知的固定长度的字符串。如果您重新使用boost :: dynamic_bitset,它可以使用运行时计算的长度。 – 2010-08-16 11:40:04

2

为什么你想把原始字符变成一个bitset?为什么不是vector<char>

在任何情况下,您都可以通过c_str()成员函数获取字符串的原始基础位,该函数通常会返回原始字符串数据的原始char*

+0

因为把一个char放入bitset中可以让你很容易地打印字符的位模式(即不用编写代码)。注意:你似乎将字符混淆(c_str()返回一个指向字符数组的指针) – 2010-08-16 11:34:40

+0

@Martin York:谢谢你为什么要把字符串放入一个bitset的解释。不过,我并没有把字符混淆。 'c_str'是获取原始字符串数据以将其放入'bitset'中的唯一方法。我提出'矢量'的唯一原因是因为我不明白他想要做什么。 – 2010-08-17 08:29:23