0

ビット セットまたは同様のものを使用しているとします。基本的には、個々のビットの値にアクセスできるオブジェクトです。処理するビット数に応じて、整数ワードやバイト配列のような単純なもの、またはJava のBitSetのようなより一般的なものになります。

私の質問は、有用なビットの長さをバイト数で表される長さに変換することに関するものです。通常、8 ビット (1 バイト) 未満のメモリを割り当てることはできず、「ビット セット」オブジェクトに余分なパディング ビットが追加されるため、これは事実上常に必要です。

要約すると、特定のサイズ (ビット単位) に対応するために必要なサイズ (バイト単位)を正しく取得するにはどうすればよいでしょうか?

注: 不正確な回答につながる可能性のある潜在的な整数オーバーフローを考慮してください。たとえば、が十分に大きいn_bytes = (n_bits + 7) / 8場合、整数オーバーフローが発生する可能性があります。n_bits

4

2 に答える 2

0

long long int を使用すると、int オーバーフローを回避できます。

n_bytes = static_cast<int>((n_bits + 7LL) / 8)

于 2013-02-16T21:10:41.433 に答える
0

これはうまくいく答えですが、これよりも速い方法があると思います。

if ((bit_size % 8) == 0)
    byte_size = bit_size/8
else
    byte_size = bit_size/8 + 1



編集:たとえば、速度を上げるために、除算を右シフトに置き換え、モジュラスをビットごとの AND に置き換えることができます。

if ((bit_size & 7) == 0)
    byte_size = bit_size >> 3
else
    byte_size = (bit_size >> 3) + 1

ただし、コンパイラはこの種の最適化を自分で行う場合があるため、これはそれほど優れているとは言えません。

于 2013-02-16T20:40:36.517 に答える