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 T
mà std::is_integral<T>::value
là true
trừ bool
tôi phải bảo lãnh, theo tiêu chuẩn, rằng:
bit_count_1
,bit_count_2
vàbit_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.
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
... 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. –