2016-01-05 9 views
5

Rozważmy następujące przypisać struktury pomocnicze:Liczba bitów reprezentacji wartości w liczbie całkowitej, zgodnie z normą?

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>() 
> {}; 

dla każdej integralnej typu T takie, że std::is_integral<T>::value jest true wyjątkiem bool mam gwarancję, przez normę, że:

  • bit_count_1, bit_count_2 i bit_count_3 mają tę samą wartość N
  • T x = 1; x <<= (N - 1) jest dobrze zdefiniowana
  • T x = ~static_cast<T>(0); x >>= (N - 1) jest dobrze zdefiniowany

Ja obecnie pracuje nad wnioskiem C++, więc muszę być pewien, czy to prawda, zgodnie z normą, czy nie, i na chwilę obecną jest to trochę niejasne dla mnie.

+0

Możesz zamienić jeden z tagów tego pytania na [tag: language-lawyer], aby przyciągnąć odpowiednich odbiorców. – Angew

+1

... i jeszcze jeden dla zwykłego tagu "C++", który jest śledzony znacznie częściej niż C++ 11 i C++ 14. Chciałbym upuścić [tag: C++ 11] lub [tag: standards], ale zostawię to tobie. –

Odpowiedz

2

Tak, oczywiście, masz!

basic.types] [3,9 \ 4

reprezentacja wartość obiektu jest zestaw bitów przytrzymujące Wartość typu T.

[basic.fundamental] 3.9.1 \ 3

Zakres nieujemne wartościami ze znakiem typu jest podzakresu odpowiedniego liczbę całkowitą bez znaku typu i reprezentacja wartość odpowiadającego mu podpisany/typu unsigned będzie sam.

[basic.fundamental] 3.9.1 \ 7

Do przedstawienia integralnych typów określa wartości przez zastosowanie czystego binarnego systemu numeracji.

50) pozycyjną reprezentacji liczby całkowite, które wykorzystuje cyfry binarne 0 i 1, w którym wartości reprezentowanych przez kolejne bitów dodatków, zaczynać się od 1 i mnoży się przez kolejne integralną siły z 2, z wyjątkiem prawdopodobnie bitów o najwyższej pozycji. (Przystosowano z amerykańskiego narodowego słownika dla systemów przetwarzania informacji.)

Ale to zależy od tego, jakie są bity non-znak:

[numeric.limits.members] 18.3.2.4 \ 9

Dla całkowitych typów, liczba bity niezarejestrowane w reprezentacji.

Jeśli dorozumiany, że bit znaku musi być tylko w tzw sign-and-magnitude representation, wtedy byłby wyrażenia te ocenione jako true:

  • bit_count_2<T>{} > bit_count_1<T>{} i
  • bit_count_2<T>{} > bit_count_3<T>{},

dla oznaczonego typu integer T reprezentowanego w układzie dwu lub jednym uzupełnienie. Tak czy inaczej, wstawiłbym static_assert, wiesz ...

Powiązane problemy