3

整数または Uint32 の最後の 6 ビットを取得する必要があります。たとえば、値が 183 の場合、最後の 6 ビットが必要110 111です55

小さなコードを書きましたが、期待どおりに動作しません。私が間違っているところを指摘してもらえますか?

int compress8bitTolessBit( int value_to_compress, int no_of_bits_to_compress )
{
    int ret = 0;
    while(no_of_bits_to_compress--)
    {
        std::cout << " the value of bits "<< no_of_bits_to_compress << std::endl;
        ret >>= 1;
        ret |= ( value_to_compress%2 );
        value_to_compress /= 2;
    }
    return ret;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int val = compress8bitTolessBit( 183, 5 );

    std::cout <<" the value is "<< val << std::endl;
      system("pause>nul");
    return 0;
}
4

5 に答える 5

16

二項算術の領域に入りました。C++ には、この種の演算子が組み込まれています。整数の「特定のビットを取得する」行為は、「AND」二項演算子で行われます。

    0101 0101
AND 0000 1111
    ---------
    0000 0101

C++ では、次のようになります。

int n = 0x55 & 0xF;
// n = 0x5

したがって、右端の 6 ビットを取得するには、

int n = original_value & 0x3F;

そして、右端の N ビットを取得するには、

int n = original_value & ((1 << N) - 1);

詳細はこちら

于 2012-09-06T16:23:06.240 に答える
7

問題はありません。ビット演算子だけを使用できませんか?例えば

u32 trimmed = value & 0x3F;

これにより、ビット単位のAND演算子を使用して、最下位6ビットのみが保持されます。

于 2012-09-06T16:20:04.410 に答える
2

tl; dr:

int val = x & 0x3F;
于 2012-09-06T16:19:45.773 に答える
2
int value = input & ((1 << (no_of_bits_to_compress + 1) - 1)

これは、2 の (n+1) 乗を計算し、1 << (no_of_bits_to_compress + 1)1 を減算して、すべてのnビットが設定されたマスクを取得します。

于 2012-09-06T16:21:27.693 に答える