2016-01-05 16 views
5

Hãy xem xét các cấu trúc helper sau:Số bit đại diện giá trị trong một số nguyên, theo tiêu chuẩn?

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

Đối với tất cả các loại không thể thiếu Tstd::is_integral<T>::valuetrue trừ bool tôi phải bảo lãnh, theo tiêu chuẩn, rằng:

  • bit_count_1, bit_count_2bit_count_3 có cùng giá trị N
  • T x = 1; x <<= (N - 1) được xác định rõ
  • T x = ~static_cast<T>(0); x >>= (N - 1) cũng được định nghĩa

Tôi hiện đang làm việc trên đề nghị một C++, vì vậy tôi cần phải chắc chắn cho dù điều này là đúng theo tiêu chuẩn, hay không, và cho thời điểm này đó là một chút không rõ ràng cho tôi.

+0

Bạn có thể trao đổi một trong các thẻ về câu hỏi này cho [tag: language-lawyer] để giúp thu hút đối tượng thích hợp. – Angew

+1

... và một thẻ nữa cho thẻ "C++" đơn giản, được theo sau nhiều hơn C++ 11 và C++ 14. Tôi sẽ thả [tag: C++ 11] hoặc [tag: standards], nhưng tôi sẽ để nó cho bạn. –

Trả lời

2

Có, tất nhiên, bạn có!

[basic.types] 3.9 \ 4

Các đại diện giá trị của một đối tượng là tập bit giữ giá trị của loại T.

[basic.fundamental] 3.9.1 \ 3

Phạm vi của các giá trị không âm của một ký số nguyên loại là một subrange của tương ứng unsigned integer loại, và các đại diện giá trị của mỗi ký/loại unsigned tương ứng sẽ là cùng.

[basic.fundamental] 3.9.1 \ 7

Cơ quan đại diện của các loại không thể thiếu trách nhiệm xác định giá trị bằng cách sử dụng một hệ thống đếm nhị phân tinh khiết .

50) Một biểu diễn vị trí cho số nguyên mà sử dụng chữ số nhị phân 0 và 1, trong đó các giá trị đại diện bởi liên tiếp bit là phụ gia, bắt đầu với 1, và được nhân với liên tiếp điện không thể thiếu của 2, ngoại trừ có lẽ đối với bit có vị trí cao nhất . (Được điều chỉnh từ Từ điển Quốc gia Hoa Kỳ cho Hệ thống xử lý thông tin.)

Nhưng nó phụ thuộc vào không dấu bit là gì:

[numeric.limits.members] 18.3.2.4 \ 9

Đối với các loại nguyên, số lượng bit không ký trong phần trình bày.

Nếu họ ngụ ý, mà bit dấu phải chỉ trong cái gọi là sign-and-magnitude representation, sau đó bạn sẽ có những biểu đánh giá là true:

  • bit_count_2<T>{} > bit_count_1<T>{}, và
  • bit_count_2<T>{} > bit_count_3<T>{},

cho số nguyên T đã ký được thể hiện trong đồng của hai hoặc một mplement. Tuy nhiên, tôi vẫn đặt static_assert, bạn biết đấy ...

Các vấn đề liên quan