0

私がやろうとした宿題は期限を過ぎているので、あなたは私の宿題をやっていません。

学習のために、いくつかのことを行う方法を知りたいです。

ビット単位の演算子を使用したマスクを使用して、1 ~ 32 をバイナリで出力するプログラムを作成できました。

私が使用したマスクの問題は、先頭に 32 個のゼロが出力され、その後に 2 進数が続くことです (例: 数値 1 の場合は 00000000000000000000000000000001)。

これは私が持っていたものです

    # include <iostream>
    #include <string>
    using namespace std; 

    string naiveBitToChar( int num ) 
    {

string st;
unsigned mask = 0x80000000;

if( num == 0 )
{
    return "0";
}

while( ( num & mask ) )
    mask >>= 1;
do 
{
    if ( num & mask ) 
    {
        st = st + "1";
    } 
        else 
        {
            st = st + "0";
        }

    mask >>= 1;
}
while( mask );


return st;
    }


    int main ( int argc, char* argv[] ) {

argc; argv;

    for( int i = 0; i < 32; i++ )
        cout << naiveBitToChar(i) << "\n";
    system ("pause");
    }

私はする必要がありました:

  1. 文字列から先頭のゼロを削除します
  2. 各文字列に 8 つの数字の最小幅を追加します (例: 00000010)
  3. 区切りマスクを使用して、4 桁ごとにアンダースコアを追加します (例: 0000_1000)

私は C++ を初めて使用します。私の先生は私のコードを見ようともしませんでした。ありがとうございました!

4

2 に答える 2

1

ここにアイデアがあります。フラグを使用して、先頭のゼロ桁を示します。ビットが 1 の場合、フラグを変更します。先行ゼロでない場合にのみ数字を出力します。

bool is_leading_zero = true;
while (/*... */)
{
  // Convert bit to character in st
  if (st == '1')
  {
    is_leading_zero = false;
  }
  if (!is_leading_zero)
  {
    cout << st;
  }
}
于 2013-02-26T16:56:05.093 に答える
0

右から左にスキャンする場合は、先行ゼロを削除する必要がなく、数値が 0 のときに停止するだけなので簡単です。

std::string binary( unsigned n )
{
    std::string bits;
    for( unsigned mask = 1; true; mask <<=1 ) {
        bits.insert( bits.begin(), n & mask ? '1' : '0' );
        n &= ~mask;
        if( !n ) break;
    }
    return bits;
}

またはさらに簡単です:

std::string binary( unsigned n )
{
    std::string bits;
    do {
        bits.insert( bits.begin(), n & 1 ? '1' : '0' );
        n >>= 1;
    } while( n );
    return bits;
}

最小幅を変更するには、ループ条件を少し変更する必要があります。unserscore を追加するには、次のように簡単にできます。

if( bits.length() % 4 ) bits.insert( bits.begin(), '_' );

内部ループ

于 2013-02-26T17:55:38.853 に答える