問題

分岐または論理式なしで次の関数を実装する必要があります。

 uint8_t func(uint32_t num, uint8_t shl)
{
    if (num >= (1 << shl))
    {
        return shl;
    }
    else
    {
        return 0;
    }
}
 

私がした最初のステップは、elseの部分が簡単であることに気付くことでした:

 return num / (1 << shl);
 

もちろん、ifの部分でこれを行うと、必ずしも望ましい結果が得られるわけではありません。

だから私はnum / (1 << shl)よりも少し「巧妙な」ものが必要だと思う。

私に1または0を与える式を考え出すことができれば、私は完了します。

算術/ビット単位の演算(つまり、分岐や論理式なし)のみを使用してこれを行う方法はありますか?

ありがとう

  ベストアンサー

条件を TRUE(1) あるいは FALSE(0) と評価するブール式として扱うことができます。

 return (num >= (1 << shl)) * shl;
 

このコードは一般的には良い考えではありませんが、分岐制約の下では、その仕事をします。

  同じタグがついた質問を見る

cbit-manipulationinteger-arithmetic