2017-02-21 10 views
0

変数nOffsetがあります。この変数には実際に何バイトが格納されているか調べたい番号が入っています。私はMSBの位置も使用できると思いますか?Cに値(int)を格納するために必要なバイト数を調べるには

int nLen = 0; 
if (nOffset > 0xFFFFFF) 
{ 
    nLen = 4; 
} 
else if (nOffset > 0xFFFF) 
{ 
    nLen = 3; 
} 
else if (nOffset > 0xFF) 
{ 
    nLen = 2; 
} 
else 
{ 
    nLen = 1; 
} 
+0

代替は、必ずしもはるかに良い、すべての底部を除く(最下位)バイトがゼロ以外のビットを有するかどうかをチェックするループを使用することです。 –

+1

ループの代わりに情報理論の式を使用する方が良いでしょう。 '(size_t)(log(number)/ log(2))' – EgorBr

+0

実際、OPのコード(実質的にアンロールされたループ)は、ループは、対数を計算するよりも速くなります。 –

答えて

1

ループと定義済みの定数を使用する方がはるかに簡単です:これは、これまでの私のコード(sizeof(size_t)が4である)です。

バイトの最大値で整数を除算すると、ゼロになるまで+1で表すことができます。反復回数はバイト数です。

以下の整数の精度を保存するために必要なバイト数を出力:

+0

これらは符号なしの値なので、 'a/=(1u << CHAR_BIT);」をより単純な' a >> = CHAR_BIT; 'に置き換えることができます。 – user694733

+0

@ user694733もともと、コードは符号付き整数を扱っていました。 – 2501

1
size_t a = SIZE_MAX; 

size_t bytes = 0; 
while(a != 0) 
{ 
    a /= (1u << CHAR_BIT); 
    bytes++; 
} 

あなたはGCC

に組み込み関数以下使用することができ - 組み込み関数:int __builtin_clz (unsigned int x)
Xの先頭の0ビットの数を最上位ビットの位置から返します。 X0の場合、結果は不定です。

- 組み込み関数:__builtin_clzと同様にint __builtin_clzl (unsigned long)
、引数の型がunsigned longである点が異なります。

- 組み込み関数:__builtin_clzと同様にint __builtin_clzll (unsigned long long)
、引数の型がunsigned long longである点が異なります。

先行ゼロの数を見つけた後、簡単な計算である - 必要なビットの数を見つけるために、(num_bits = intのビット数先行ゼロ)。必要なバイト数を(num_bits + 7)/8に変更することができます。

+1

[サンプルコード](http://ideone.com/H1f1o7)。 0の入力が可能な場合、 'if(u == 0)return 1;'を追加することができます。 –

+0

'_BitScanReverse'はMSVCの同様の目的のために使用することができます – sp2danny

+0

OPはGCCについて言及していませんでした。 – Lundin

1

あなたはint変数によって取られ何バイトを探しているなら、あなたはその後、バイト数を計算することができ、特にINT_MININT_MAX定数、limits.hライブラリに見ることができます。

あなたが特定の整数を符号化するために必要とされているどのように多くのバイトを探している場合は、どちらか

  1. 整数よりも同等以上だ2 pow(2, N)の最小の力を見つけ、アルゴリズムを使用して、Nは次のようになります最小ビット数。これは簡単ですが、整数が負の場合は小さなキャッチがあります。https://softwareengineering.stackexchange.com/questions/239036/how-are-negative-signed-values-storedを参照してください。

  2. 数字のビットを印刷して数えてみます。C printing bitsを参照してください。

0

MSBから始まるデータを繰り返して、各バイトを0xFFでマスクするだけです。どのバイトがMSB portabilyかを知るためには、ビットシフトを使用する必要があります。

このスニペットでは、iはシフトするビット数です。

size_t i; 
for(i=sizeof(data)*8; i!=0; i-=8) 
{ 
    if((data >> (i-8)) & 0xFF) 
    { 
    break; 
    } 
} 

size_t bytes_to_copy = i/8; 
関連する問題