前回に引き続き、今度は1の補数表現かどうかを判定するメタ関数を作っています。
2の補数表現のときと理屈は同じです。-1の下位2ビットが10 (= 2)であれば1の補数表現です。
0 1 2 3 4 5 6 |
template<class T> struct is_1s_complement { static const bool value = (T(-1) & 3) == 2; }; |
前回同様、C++14以降であれば、次のようにしておけば多少は使い勝手がよくなります。
0 1 2 3 |
template <class T> constexpr bool is_1s_complement_v = is_1s_complement<T>::value; |
現実には負の整数値の内部表現が1の補数の処理系に遭遇することはほとんどありません。また、C++20からは2の補数が使われることが規定されましたので、今回のメタ関数は必ずfalseを返すことになるでしょう。