C++ 将短字符串转换为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++ ) {

出于许多目的,压缩到无符号32位整数中的短字符串/字符数组非常有用,因为它们可以通过简单的整数比较一次性进行比较,并可用于
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);