2016-01-05 68 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>() 
> {}; 

對於每一個整數類型T這樣std::is_integral<T>::valuetrue除了bool我必須保證,在標準,即:

  • 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

您可能想爲[tag:language-lawyer]交換此問題上的其中一個標記,以幫助吸引相應的受衆羣體。 – Angew

+1

......還有一個簡單的「C++」標籤,它跟隨C++ 11和C++ 14。我會放棄[tag:C++ 11]或[tag:standards],但我會把它留給你。 –

回答

2

是的,當然,你有!

[basic.types] 3.9 \ 4

對象的值表示組比特的持有 類型T的值

[basic.fundamental] 3.9.1 \ 3

一個符號整數類型的非負的值的範圍是相應無符號整數類型的 子範圍,並且每個相應的符號/無符號類型的值 表示應是 相同

[basic.fundamental] 3.9.1 \ 7

整型的表示應當通過使用 純二進制記數系統的定義值。

50)爲整數A位置表示一個使用 二進制數字0和1,其中,通過連續 位所表示的值相加,以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代表兩個或一個的公司mplement。 因此,無論如何,我都會輸入static_assert ...