2

特定の数のビットの特定のセットによって表される値を抽出する方法。つまり、ビット11、12、および13が1,1,0の場合、値は6である必要があります。

同じことをする最も効率的な方法は何ですか?また、それは一般的でなければなりません。開始ビットと終了ビットの位置を指定でき、開始位置と終了位置の間に存在するビットによって表される値を抽出できる必要があります。

例:00000000 00000000 01100000 00011111

上記の数値の場合、0番目のビットが右端からのものであると考えると、この数値を開始位置として0、終了位置として2を指定すると、値7が得られます。

また、上記の問題についても、エンディアンをどのように処理するのでしょうか。

4

1 に答える 1

6
six = (value >> 12) & 7;

ジェネリックになりたい場合は、

inline unsigned extract_continuous_bits(unsigned value, int start, int end) {
    unsigned mask = (~0u) >> (CHAR_BIT*sizeof(value) - end - 1);
    return (value & mask) >> start;
}

assert(extract_continuous_bits(0x601f, 12, 14) == 6));
assert(extract_continuous_bits(0x601f, 0, 2) == 7));
assert(extract_continuous_bits(0xf0f0f0f0, 0, 31) == 0xf0f0f0f0));
assert(extract_continuous_bits(0x12345678, 16, 31) == 0x1234));
assert(extract_continuous_bits(0x12345678, 0, 15) == 0x5678));

エンディアンについては、エンディアンについていつ心配するかを参照してください。

于 2010-02-07T10:17:16.040 に答える