ein*_*ica 28 c++ bit-manipulation idiomatic
我正在一个我无法访问C++标准库的环境中编写C++代码,特别是不能访问std::numeric_limits
.假设我想实施
template <typename T> constexpr T all_ones( /* ... */ )
Run Code Online (Sandbox Code Playgroud)
专注于无符号整数类型,我放在那里?具体来说,static_cast<T>(-1)
够好吗?(根据我的猜测,我可以将其他类型视为无符号字符数组.)
Lea*_*ros 32
使用bitwise NOT
操作~
上0
.
T allOnes = ~(T)0;
Run Code Online (Sandbox Code Playgroud)
A static_cast<T>(-1)
假设是两个补码,不可移植.如果你只关心未签名的类型,那么hvd的答案是要走的路.
工作示例:https://ideone.com/iV28u0
小智 22
专注于无符号整数类型,我放在那里?具体来说,static_cast(-1)足够好了
如果您只关心无符号类型,是的,转换-1
对于所有标准C++实现都是正确的.对无符号类型的操作(包括将有符号类型转换为无符号类型)保证以模数(max + 1)工作.
这种解除武装的直接方式.
T allOnes;
memset(&allOnes, ~0, sizeof(T));
Run Code Online (Sandbox Code Playgroud)
专注于无符号整数类型,我放在那里?具体来说,static_cast(-1)足够好了
是的,这已经足够了.
但我更喜欢十六进制值,因为我的背景是嵌入式系统,而且我总是必须知道sizeof(T).
即使在桌面系统中,我们也知道以下T的大小:
uint8_t allones8 = 0xff;
uint16_t allones16 = 0xffff;
uint32_t allones32 = 0xffffffff;
uint64_t allones64 = 0xffffffffffffffff;
Run Code Online (Sandbox Code Playgroud)