0

私はいくつかの個人的な仕事のためにこの機能を必要としています。これを行うのは一般的に簡単ですが、ビットシフトを実際に試したことはありません。整数を符号なし整数のベクトルに変換しようとする次のコードがあります。ここで、それぞれは 1 または 0 (ビットを表す) です。整数は常に 0 以上であると想定できます。これが私のコードです。

vector<unsigned int> toBinary(int x)
{
    stack<unsigned int> s;
    vector<unsigned int> ret_val;

    for (unsigned i = 0; i < sizeof(x); ++i)
    {
        int z = ((x >> i) & 1) ? 1 : 0;
        s.push(z);
    }

    unsigned num_bits = s.size();
    for (unsigned i = 0; i < num_bits; ++i)
    {
        ret_val.push_back(s.top());
        s.pop();
    }

    return ret_val;
}

これは 16 までの整数に対しては問題なく動作しますが、失敗します。スタックを使用してビットの順序を逆にし、最上位ビットが最終的な戻り値の左側にくるようにします。これが壊れているのはなぜですか?どうすればクリーンアップできますか? ありがとうございました

4

1 に答える 1

4

x は int です。サイズはおそらく 32 ビット、つまり4 バイトです。sizeof x = 4、4 ビットで数値 0..15 を許可

1 バイトが 8 ビットであるため、8*sizeof x が必要ですが、もっと良い方法があります (以下を参照)。

賢明なクリーンアップ:

  1. using namespace std使用する必要がある場合は避けてください using std::vector。これは で物事を装飾することを意味しますstd::が、読みやすさのためには価値があります。

  2. unsigned intではなく使用intして、使用しているものを明示してください。

  3. のベクトルを返すbool方が理にかなっているようです。

  4. unsigned int のビット数はstd::numeric_limits<unsigned int>::digits( #include <limits>) で与えられます。

  5. std::reverseベクトル ( )を使用することで、簡単にスタックの使用を避けることができます#include <algorithm>

すべてをまとめると、関数は次のようになります。

std::vector<bool> toBinary(unsigned int x)
{
    std::vector<bool> ret_val;

    for ( unsigned int z = x; z > 0; z /= 2 ) {

        bool r = ( ( z & 1 ) == 1 );
        ret_val.push_back(r);
    }

    int bits = std::numeric_limits<unsigned int>::digits;
    ret_val.resize(bits);

    std::reverse( ret_val.begin(), ret_val.end() );

    return ret_val;
}
于 2012-09-06T17:19:21.003 に答える