1.12 無符号整数の最下位の '1' のビットだけを抽出する。

次のメタ関数は、1 が立っている最も下位のビットだけを残し、他のビットを 0 にします。

template<unsigned long X>
struct lowest_1_bit
{
  static const unsigned long value = X & (~X + 1u);
};

上のメタ関数では静的な処理しか行えませんので、通常の関数テンプレートにしたのが下記です。

template<class T>
T lowest_one_bit(T value)
{
  return value & (~value + 1u);
}

いずれも、負の値を与えると、処理系や値によっては未定義の動作を引き起こす可能性があります。BOOST_STATIC_ASSERT マクロなどを用いて、静的に条件判定を行うのもよいでしょう。


元ネタ
このエントリーを含むはてなブックマーク