3

C++ の正の整数 (0 ~ 2,147,483,647) を 32 ビット バイナリに変換して表示します。

私は伝統的な「数学的」方法でそれを行いたいです(ビットセットを使用したり、ベクトル* .pushback *または再帰関数を使用したり、C ++で特別なものを使用したりするのではなく...)、(1つの理由は、異なる言語で実装できるようにするためです。まあ多分)

そこで、次のような単純なプログラムを実装します。

#include <iostream>
using namespace std;
int main()
{
    int dec,rem,i=1,sum=0;
    cout << "Enter the decimal to be converted: ";
    cin>>dec;
    do
    {
        rem=dec%2;
        sum=sum + (i*rem);
        dec=dec/2;
        i=i*10;
    } while(dec>0);

    cout <<"The binary of the given number is: " << sum << endl;

    system("pause");
    return 0;
}

問題は、9999 などの大きな数値を入力すると、合計が整数であり、最大範囲を超えて処理できないため、結果が負または奇妙な数値になることです。 C ++の数値型には大きすぎますか?. ここで、質問が必要な場合の 32 ビット番号の表示に関する提案はありますか?

4

7 に答える 7

7

結果として得られるsumものは、印刷以外にはほとんど使用できません。2進数のように見える10進数です。

10進数と2進数の変換自体が目的ではない場合、コンピュータメモリ内の数値はすでに2進数で表されており(C ++のプロパティではない)、必要なのはそれを印刷する方法だけであることに注意してください。考えられる方法の1つは次のとおりです。

int size = 0;
for (int tmp = dec; tmp; tmp >>= 1)
    size++;
for (int i = size - 1; i >= 0; --i)
    cout << ((dec >> i) & 1);

文字配列を使用する別のバリ​​アント:

char repr[33] = { 0 };
int size = 0;
for (int tmp = dec; tmp; tmp >>= 1)
    size++;
for (int i = 0; i < size; ++i)
    repr[i] = ((dec >> (size - i - 1)) & 1) ? '1' : '0';
cout << repr << endl;

decが負の場合、両方のバリアントが機能しないことに注意してください。

于 2012-05-21T09:55:26.740 に答える
4

数値があり、そのバイナリ表現、つまりstringが必要です。そのため、数値型ではなく文字列を使用して結果を保存してください。

于 2012-05-21T09:34:51.917 に答える
3

for ループと定義済みのゼロ文字配列を使用します。

#include <iostream>
using namespace std;
int main()
{
    int dec;
    cout << "Enter the decimal to be converted: ";
    cin >> dec;

    char bin32[]  = "00000000000000000000000000000000";
    for (int pos = 31; pos >= 0; --pos)
    {
        if (dec % 2) 
            bin32[pos] = '1';
        dec /= 2;
    }

    cout << "The binary of the given number is: " << bin32 << endl;
}

パフォーマンス上の理由から、for ループを時期尚早に一時停止することができます。

    for (int pos = 31; pos >= 0 && dec; --pos)

C++ では、整数をブール値として扱うことができることに注意してください。すべて != 0 が true と見なされます。

于 2012-05-21T11:17:52.073 に答える
3

符号なし整数型を使用できます。ただし、より大きな型を使用しても、最終的にはバイナリ表現を格納するスペースが不足します。おそらく、それらを に格納する方がよいでしょうstring

于 2012-05-21T09:32:22.023 に答える
1

他の人が指摘したように、結果を文字列で生成する必要があります。これを行う古典的な方法 (2 ~ 36 の基数で機能します) は次のとおりです。

std::string
toString( unsigned n, int precision, unsigned base )
{
    assert( base >= 2 && base <= 36 );
    static char const digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    std::string retval;
    while ( n != 0 ) {
        retval += digits[ n % base ];
        n /= base;
    }
    while ( retval.size() < precision ) {
        retval += ' ';
    }
    std::reverse( retval.begin(), retval.end() );
    return retval;
}

その後、表示できます。

于 2012-05-21T10:34:16.423 に答える
0

再帰。擬似コード:

function toBinary(integer num)
  if (num < 2) 
  then
    print(num)
  else
    toBinary(num DIV 2)
    print(num MOD 2)
  endif
endfunction

これは、先行ゼロまたは負の数を処理しません。再帰スタックは、バイナリ ビットを標準順序に逆にするために使用されます。

于 2012-05-21T12:43:41.867 に答える
-1

書くだけ:

long int dec,rem,i=1,sum=0  

それ以外の:

int dec,rem,i=1,sum=0;

これで問題は解決するはずです。

于 2013-08-11T15:20:26.670 に答える