考虑以下帮助器结构:
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 ++提案,所以我需要确定这是否符合标准,或者目前对我来说有点不清楚。
答案 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
,你知道......