私は16ビット整数の有用なビット数を決定する関数を書いています。
int16_t
f(int16_t x)
{
/* ... */
}
たとえば、数値「0000001000100101」には10個の有効ビットがあります。ビット演算子を使用する必要があると思いますが、方法がわかりません。私はそれを行うためのいくつかの方法を探しています。
私は16ビット整数の有用なビット数を決定する関数を書いています。
int16_t
f(int16_t x)
{
/* ... */
}
たとえば、数値「0000001000100101」には10個の有効ビットがあります。ビット演算子を使用する必要があると思いますが、方法がわかりません。私はそれを行うためのいくつかの方法を探しています。
gcc(またはICCなどのgcc互換コンパイラ)を使用している場合は、組み込み組み込み関数を使用できます。
#include <limits.h>
int f(int16_t x)
{
return x != 0 ? sizeof(x) * CHAR_BIT - __builtin_clz(x) : 0;
}
これは、最後の先行ゼロビットの右側のビット数が必要であることを前提としています。
MSVCの場合_BitScanReverse
、調整を加えて使用できます。
それ以外の場合、これを移植可能にする必要がある場合は、独自の汎用clz
関数を実装できます。たとえば、 http: //en.wikipedia.org/wiki/Find_first_setを参照してください。
これらはビットスキャン操作と呼ばれ、Intelアーキテクチャにはアセンブリ命令があります(Cから直接呼び出すことができます) 。ここを参照してください。ここからMSコンパイラのスタートを使用している場合。
対数は、特定の基数に対して特定の数値を表すために必要な桁数を計算します。
次の整数[x]
にx
丸められます。
次に、ベース[log_b(x)]
を表すために必要な桁数です。x
b
x
したがって、 Cの一部の有効ビット数を知りたい場合は、がわかりceil(log2(x))
ます。
定数時間でのバイナリ表現の先行ゼロの数を示すアルゴリズムがないため、対数の計算は、単純に反復するよりも実際には高速である可能性があります。