1
  while(i < length)
  {
    pow = 1;
    for(int j = 0; j < 8; j++, pow *=2)
    {   
      ch += (str[j] - 48) * pow;
    }   
    str = str.substr(8);
    i+=8;
    cout << ch; 
    ch = 0;
  }

これは私のプログラムを大幅に遅くしているようです。そこで使用している文字列関数のためですか、それともこのアプローチは一般的に間違っています。長い除算を実装する方法があることは知っていますが、それが実際にこの方法よりも効率的かどうかを確認したかったのです。同じ一般的なアルゴリズムを使用しない別の方法は考えられないため、問題は私の実装だけかもしれません。

4

5 に答える 5

5

おそらく、標準ライブラリ関数の使用を検討する必要があるかもしれません。それらはおそらく、少なくともコンパイラーを介して実行するものと同じくらい最適化されています。

#include <iostream>
#include <iomanip>
#include <cstdlib>

int main (void) {
    const char *str = "10100101";

    // Use str.c_str() if it's a real C++ string.
    long int li = std::strtol (str, 0, 2);

    std::cout
        << "binary string = " << str
        << ", decimal = " << li
        << ", hex = " << std::setbase (16) << li
        << '\n';
    return 0;
}

出力は次のとおりです。

binary string = 10100101, decimal = 165, hex = a5
于 2012-07-30T06:53:11.463 に答える
1

各ループごとに新しい部分文字列を作成するなど、不必要なことをしています。代わりに使用できますstr[i + j]

また、0 または 1 にべき乗を掛ける必要もありません。if ステートメントを使用するだけです。

  while(i < length)
  {
     pow = 1;
     for(int j = 0; j < 8; j++, pow *=2)
     { 
         if (str[i + j] == '1')
            ch += pow;
     }
     i+=8; 
     cout << ch; 
     ch = 0; 
  } 

これにより、少なくとも少し速く実行されます。

于 2012-07-30T07:00:02.730 に答える
0

簡単な答えは次のとおりです。

long int x = strtol(your_binary_c++_string.c_str(),(char **)NULL,2)

おそらく、以下のように int または long int を使用できます。

2 進数を 0 から n-1 (n は最上位ビット (MSB)) まで段階的にトラバースし、累乗で 2 を乗算し、合計を加算します。たとえば、1000 (バイナリで 8 に相当) を変換するには、次のようにします。

1 0 0 0 ==> 右から左へ

0 x 2^0 = 0 0 x 2^1 = 0; 0×2^2=0; 1×2^3=8; それらを一緒に追加します。つまり、0 + 0 + 0 + 8 = 8; これは 1000 に相当する 10 進数です。以下のプログラムを読んで、概念がどのように機能するかをよりよく理解してください。注意 : プログラムは 16 ビットの 2 進数 (非浮動) 以下でのみ動作します。不明な点があればコメントを残してください。必ず返信が来ます。

// 2 進数を 10 進数に変換するプログラム

#include <iostream>
#include <math.h>

int main()
{
     int x;
     int i=0,sum = 0;
     // prompts the user to input a 16-bit binary number
     std::cout<<" Enter the binary number (16-bit) : ";
     std::cin>>x;

     while ( i != 16 ) // runs 16 times
     {
          sum += (x%10) * pow(2,i);
          x = x/10;
          i++;
     }
     std::cout<<"\n The decimal equivalent is : "<<sum;
     return 0;
}
于 2012-07-30T06:54:35.570 に答える
0

次のようなものはどうですか:

int binstring_to_int(const std::string &str)
{
    // 16 bits are 16 characters, but -1 since bits are numbered 0 to 15
    std::string::size_type bitnum = str.length() - 1;
    int value = 0;

    for (auto ch : str)
    {
        value |= (ch == '1') << bitnum--;
    }

    return value;
}

それは私が考えることができる最も簡単です。これは、新しい C++11 for-each ループ構成を使用することに注意してください。コンパイラがそれを処理できない場合は、使用できます。

for (std::string::const_iterator i = str.begin(); i != str.end(); i++)
{
    char ch = *i;
    // ...
}
于 2012-07-30T06:59:05.880 に答える
0

操作の数を最小限に抑え、複数回計算しないでください。乗算して上に移動するだけです:

unsigned int result = 0;

for (char * p = str; *p != 0; ++p)
{
    result *= 2;
    result += (*p - '0');  // this is either 0 or 1
}

このスキームは、10 未満の任意の基数に容易に一般化されます。

于 2012-07-30T06:57:24.520 に答える