把4个char [a-z]“literal”作为uint16_t

时间:2013-09-18 14:51:33

标签: c

在C(使用gcc)中,是否可以使用4 char [az]“literal”(例如“enus”/ {'e','n','u','s'} / .. 。)作为uint16_t?

我希望能够使用4个字符串语言环境(比如'en-us',但'enus'也可以,因为' - '是多余的afaik)直接作为无符号16位整数没有任何运行时开销的代码。

E.g。 'en-us'可以映射到(('e' - 96)<< 12)| (('n' - 96)<< 8)| (('u' - 96)<< 4)| ('s' - 96)。 (这只是一个例子,我没有任何映射/算法,至少保持值0不变(用于检测“没有设置”))

任何解决方案都不需要是可移植的(WRT endianess等),但实际上使用uint16_t应该没有运行时开销。

非常感谢!

P.S。:随意为问题添加更多标签,不知道除了“c”之外还要使用什么。 THX。

3 个答案:

答案 0 :(得分:2)

GCC documentation中指定了多字符常量的处理。 GCC通过将前一个值移动每个字符的位数和ORing新字符来评估多字符常量。

当目标使用八位字符(今天最常见)时,四个字符将不适合uint16_t。要使用uint16_t,您需要定义自己的映射,从一些文字到uint16_t

答案 1 :(得分:1)

您可以在16位整数中编码4位4位值。使用4位,您可以编码16个不同的字符。

当然,如果您要选择如何编码每个字符,则可以将“enus”编码为16位整数,但不能对每个4个字母的字符串进行编码。英语中有超过16个字母,因此有些字母无法表示。

答案 2 :(得分:0)

我唯一想到的就是使用uint16_t作为表(字符串或其他)的索引。如果你没有内存限制,那么你可以轻松地完成这项任务并且开销很小。