2016-01-05 11 views
5

は、以下のヘルパー構造体を考えてみましょう:整数値表現ビットの数は、標準によると?

template <class T> 
struct bit_count_1: 
std::integral_constant< 
    std::size_t, 
    std::numeric_limits<typename std::make_unsigned<T>::type>::digits 
> {}; 

template <class T> 
struct bit_count_2: 
std::integral_constant< 
    std::size_t, 
    std::numeric_limits<T>::digits + std::is_signed<T>::value 
> {}; 

template <class T> 
constexpr std::size_t compute_bit_count() { 
    using type = typename std::make_unsigned<T>::type; 
    constexpr type zero = 0; 
    constexpr type one = 1; 
    constexpr type max = ~zero; 
    type current = max; 
    std::size_t i = 0; 
    while (current) { 
     current >>= one; 
     ++i; 
    } 
    return i; 
} 

template <class T> 
struct bit_count_3: 
std::integral_constant< 
    std::size_t, 
    compute_bit_count<T>() 
> {}; 

すべての整数型の場合はstd::is_integral<T>::valueは、私は、標準で、その保証を持っているんbool以外trueであることをTな:

  • bit_count_1bit_count_2bit_count_3を同じ値を有するN
  • T x = 1; x <<= (N - 1)はよく定義されている
  • T x = ~static_cast<T>(0); x >>= (N - 1)がよく

を定義している私は現在、C++の提案に取り組んでいますので、私はこれが標準に従って真実であるか、ない、と一瞬それが私のために少しは不明だかどうかを確認する必要があります。

+0

この質問のタグの1つを[tag:language-lawyer]に置き換えて、適切なユーザーを引き付けるのに役立ちます。 – Angew

+1

... C++ 11とC++ 14よりもはるかに多くの「C++」タグのためのもう1つ。私は[tag:C++ 11]か[tag:standards]のいずれかを削除しますが、私はあなたにそれを残します。 –

答えて

2

はい、もちろんあります。

[basic.types] 3.9 \ 4

オブジェクトの値表現は 型Tの値

を保持するビットの集合であります[基本事項] 3.9.1 \ 3

符号付き整数の非負値の範囲タイプは、対応する符号なし整数タイプ、および各対応する符号付き/符号なしのタイプは 同じでなければならないの値 表現の部分範囲です。

[basic.fundamental】3.9.1 \ 7

整数型の表現は 純粋なバイナリ記数法を用いて値を定義しなければなりません。

50)連続 ビットで表される値が1で始まり、添加され、そして連続 積算電力を乗じた 二進数字0と1を使用して整数の位置表現がおそらく、 の位置のビットを除いて、2のを除きます。 ( 情報処理システムのアメリカン・ナショナル・ディクショナリから適応される。)

しかし、それは、非符号ビットが何であるかに依存する:整数タイプの

[numeric.limits.members] 18.3.2.4 \ 9

の数非符号ビットを表現に使用します。

彼らは符号ビットがのみのでsign-and-magnitude representationと呼ばれる中でなければならないことを、暗示した場合は、trueとして評価これらの表現を持っているでしょう:

  • bit_count_2<T>{} > bit_count_1<T>{}、および
  • bit_count_2<T>{} > bit_count_3<T>{}

符号付き整数型Tが2または1のco mplement。 とにかくstatic_assertと書いておきます...

関連する問題