考慮下面的助手結構:根據標準,整數中的值表示位的數量?
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>::value
是true
除了bool
我必須保證,在標準,即:
bit_count_1
,bit_count_2
和bit_count_3
具有相同的值N
T x = 1; x <<= (N - 1)
明確定義T x = ~static_cast<T>(0); x >>= (N - 1)
被很好地定義
我目前工作的一個C++的建議,所以我必須確保按照標準,這是否是真實的,或沒有,在目前這對我來說有點不清楚。
您可能想爲[tag:language-lawyer]交換此問題上的其中一個標記,以幫助吸引相應的受衆羣體。 – Angew
......還有一個簡單的「C++」標籤,它跟隨C++ 11和C++ 14。我會放棄[tag:C++ 11]或[tag:standards],但我會把它留給你。 –