C++ 将短字符串转换为32位整数的最有效方法是什么?
出于许多目的,压缩到无符号32位整数中的短字符串/字符数组非常有用,因为它们可以通过简单的整数比较一次性进行比较,并可用于C++ 将短字符串转换为32位整数的最有效方法是什么?,c++,string,c++11,integer,constexpr,C++,String,C++11,Integer,Constexpr,出于许多目的,压缩到无符号32位整数中的短字符串/字符数组非常有用,因为它们可以通过简单的整数比较一次性进行比较,并可用于switch语句,同时仍保持一定的可读性 将这些短字符串转换为32位整数的最常见方法是移位/或: #include <stdint.h> uint32_t quadchar( const char* _str ) { uint32_t result = 0; for( size_t i=0; i<4; i++ ) {
switch
语句,同时仍保持一定的可读性
将这些短字符串转换为32位整数的最常见方法是移位/或:
#include <stdint.h>
uint32_t quadchar( const char* _str )
{
uint32_t result = 0;
for( size_t i=0; i<4; i++ )
{
if( _str[i] == 0 )
return result;
result = (result << 8) | _str[i];
}
return result;
}
#包括
uint32四字符(常量字符*\u字符串)
{
uint32_t结果=0;
对于从C++11开始的(size_t i=0;i),可以在编译时使用
名称空间内部
{
uint32\u t内联constexpr quadchar(char const*\u输入,
uint8_t_idx,uint32_t_结果)
{
返回_idx==4?\u结果
:*_input?quadchar(_input+1,_idx+1,(_result不需要细节辅助函数:可以使用默认值
而且不需要双三元运算符:您可以通过一次测试生成所有
std::uint32_t inline constexpr quadchar (char const * input,
std::size_t idx = 0U,
std::uint32_t result = 0U)
{
return (idx < 4U) && *input
? quadchar(input+1, idx+1U, (result << 8) | *input)
: result;
}
你可以打电话
constexpr auto u32 = ichar(ptr);
当您需要一个std::uint32\u t
时,或(通过示例)
constexpr auto u64=ichar(ptr);
对于其他返回的类型。使用C++14及更高版本,您只需将constexpr
添加到您的函数中。已经有一个答案说明了如何执行此操作(即递归)对于C++11。对于C++03,实际上不可能获得一个好的语法,但是C++03的一个解决方案是通过一些脚本对源代码进行预处理。union方法是未定义的行为,结果取决于CPU的端性。@Barmar:是的,thx。我删除了这一段。适用于该问题的相同可移植性警告也适用这可能是因为,如果转换后的字符串从未被持久化或通过网络发送,则无所谓。调用honl()
在这里可能是明智的。在许多CPU上,编译成很少的指令-可能只有一条指令。对不起,我不完全理解你的意思。什么是不可移植的?据我所知,一切都应该是可移植的,不依赖于持久性。什么是honl()
,请?找不到有关它的任何信息。谢谢。sizeof()
和模板思想非常好。我不太确定CHAR\u-BIT
。如果CHAR\u-BIT
!=8,由于移位不同,结果将不同于8位CHAR;我认为这种方法的可移植性较低,而不是更高。使用输入字符执行额外的&0xff
可能更好。helper函数用于隐藏结果
和输入
参数,因为它们对用户没有意义。但是默认参数当然也可以。@user2328447-我对字符位
也有一些疑问(例如:在字符位=12
的平台中存在std::uint32_t
)但是考虑到如果CHAR\u-BIT>8
(8
是最小值),那么input
中的每个字符都有CHAR\u-BIT
位;因此,对于(result@user2328447-是的:&0xff
的想法可能是一个很好的替代解决方案;考虑到这一点,您就失去了对字符中某些位的使用(在CHAR\u BITS>8
的情况下)在输入中管理正确的位可能会很困难,并且取决于平台。
template <typename I = std::uint32_t>
constexpr inline I ichar (char const * input,
I result = 0U,
std::size_t idx = 0U)
{
return (idx < sizeof(I)) && *input
? ichar(input+1, idx+1U, (result << CHAR_BIT) | *input)
: result;
}
constexpr auto u32 = ichar(ptr);
constexpr auto u64 = ichar<std::uint64_t>(ptr);