次のメタ関数は、1が立っている最も下位のビットだけを残し、他のビットを0にします。
0 1 2 3 4 5 6 |
template<unsigned long X> struct lowest_1_bit { static const unsigned long value = X & (~X + 1u); }; |
上のメタ関数では静的な処理しか行えませんので、通常の関数テンプレートにしたのが下記です。
0 1 2 3 4 5 6 |
template<class T> T lowest_one_bit(T value) { return value & (~value + 1u); } |
いずれも、負の値を与えると、処理系や値によっては未定義の動作を引き起こす可能性があります。
ちなみにC++11以降であれば先ほどのlowest_one_bit関数をconstexprにすることもできます。