20487


C++で、文字列を2進数表記のintに変換する方法を探しています。  
いろいろと検索しては見ましたが、どれもprintfを用いた標準出力の方法でした。

文字列をバイナリ変換し、それを2進数変換、  
結果を文字列変換し、数値に変換する  
という手順を踏む必要があるのかなと思いますが、  
stringなどのクラスにgetByte()などの関数も見当たらないため、どういった方法で変換するのかわかりません。

たとえば、  
"文字列" という入力があった場合、  
"e69687 e5ad97 e58897"  
に変換し、  
"[1110 0110 1001 0110 1000 0111] [1110 0101 1010 1101 1001 0111] [1110 0101
1000 1000 1001 0111]"  
となります。  
これを  
int[] mo = [1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, ...]  
int[] zi = [1, 1, 1, 0, 0, 1, 0, 1, ...]  
略  
という形に変換したいです。


CC BY-SA 3.0
2015-12-29T14:32:07.573
20454
2015-12-30T17:45:40.923
2015-12-30T13:22:53.297
8396
8396
question
c++
C++で文字列を2進数変換して出力する方法


C++11 の wstring_convert class と range-based for loop を使ってみました。配列ではなく vector
に変換結果を格納しています。

[code]

    #include <iostream>
    #include <iomanip>
    #include <locale>
    #include <codecvt> 
    #include <climits>
    #include <bitset>
    #include <vector>
    
    using namespace std;
    
    int main() {
      const u32string str = U"SO新年";
      vector<int>** bit_vectors = new vector<int>*[str.size()];
      wstring_convert<codecvt_utf8<char32_t>, char32_t> converter;
    
      int n = 0;
      for(const char32_t& c : str) {
        string u8_char = converter.to_bytes(c);
        bit_vectors[n] = new vector<int>(0);
        for(const char& uc : u8_char) {
          for(char& bc : bitset<CHAR_BIT>(uc).to_string()) {
            bit_vectors[n]->push_back(bc - '0');
          }
        }
        n++;
      }
    
      // Show all elements
      for(size_t i=0;i<str.size();i++){
        cout << setfill(' ') << setw(2) << converter.to_bytes(str.at(i)) << ": ";
        cout << "[";
        for(const int &v : *bit_vectors[i]){
          cout << v << ", ";
        }
        cout << "\b\b]" << endl;
        delete bit_vectors[i];
      }
      delete bit_vectors;
    
      return 0;
    }
    
[/code]

**実行結果**

[code]

    $ g++ --version
    g++ (Ubuntu 5.2.1-23ubuntu1~15.10) 5.2.1 20151028
    $ g++ -std=c++11 -O -o bit_vectors bit_vectors.cc
    $ ./bit_vectors
     S: [0, 1, 0, 1, 0, 0, 1, 1]
     O: [0, 1, 0, 0, 1, 1, 1, 1]
    新: [1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0]
    年: [1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0]
    : [1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1]
    
[/code]


CC BY-SA 3.0
2015-12-30T16:32:43.490
20487
2015-12-30T17:45:40.923
2015-12-30T17:45:40.923
20454
answer