根据标准,整数中的值表示位数?

时间:2016-01-05 11:57:42

标签: c++ standards language-lawyer c++14 bit

考虑以下帮助器结构:

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 truebool之外,我是否按照标准保证:

  • bit_count_1bit_count_2bit_count_3具有相同的值N
  • T x = 1; x <<= (N - 1)定义明确
  • T x = ~static_cast<T>(0); x >>= (N - 1)定义明确

我目前正在制作一个C ++提案,所以我需要确定这是否符合标准,或者目前对我来说有点不清楚。

1 个答案:

答案 0 :(得分:2)

是的,当然,你有!

[basic.types] 3.9 \ 4

  

对象的值表示是持有的位组   类型T的值。

[basic.fundamental] 3.9.1 \ 3

  

带符号整数类型的非负值范围是a   相应无符号整数类型的子范围和值   每个相应的有符号/无符号类型的表示应为   相同

[basic.fundamental] 3.9.1 \ 7

  

整数类型的表示应使用a定义值   纯二进制计算系统。 50

     

50)使用the的整数的位置表示   二进制数字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.  所以,无论如何我都会放static_assert,你知道......