0

これは私がする必要があることです:

int lg(int v)
{
    int r = 0;
    while (v >>= 1) // unroll for more speed...
    {
        r++;
    }
}

上記の解決策をhttp://graphics.stanford.edu/~seander/bithacks.html#IntegerLogで見つけました。

これは機能しますが、ループ、制御構造、または 0xFF (255) より大きい定数を使用せずに実行する必要があります。これを見つけるのは非常に難しいことがわかっています。フォームの条件を使用して何かを理解しようとしています

( x ? y : z ) = (((~(!!x) + 1)) & y) | ((~(~(!!x) + 1)) & z)

しかし、私はそれを機能させることができません。御時間ありがとうございます。

4

2 に答える 2

0

オペレーターさえも含め、制御構造がなくても、?:独自のアルゴリズムをシミュレートできます

int r = 0;

x >>= 1;
r += (x != 0);
x >>= 1;
r += (x != 0);
...

ただし、C では、

  • xは正であると想定されます (それ以外の場合int x=-1;、たとえば x >>= 1 n 回は常に!= 0
  • x != 00 ( false ) または 1 (*true)を返すような条件
于 2013-02-01T02:36:15.670 に答える
0

それは宿題のように聞こえます。制御構造を使用できない場合は、できることを事前に計算することをお勧めします: 分割統治です。より小さな部分 (1 バイト、1 ニブル、選択) を求めて、整数の部分に適用します。

于 2013-02-01T02:05:16.693 に答える