【问题标题】:Enum and strings in CC中的枚举和字符串
【发布时间】:2013-10-04 18:15:36
【问题描述】:

我有一个 char* 字符串进来。我需要相应地存储它。

字符串可以是任何这些值 { UK, GD, BD, ER, WR, FL}

如果我想将它们保留为枚举类型,最好使用哪种数据类型。像 6 个值 3 位就够了,但是 C 中如何存储 3 位呢?

【问题讨论】:

  • value:2 不起作用?此外,对于 6 个值,两位是不够的。你需要 3 个。
  • “两个比特就够了”...你打算用其他六个比特做一些根本上重要的事情,还是无缘无故地让生活变得更艰难?
  • 您打算如何将六个选项中的一个选项存储在两位中?
  • 为什么要优化使用的位数?您是否在只有 4K 内存的平台上运行?只需让编译器使用尽可能多的位即可。 (很可能是 8、16 或 32 位)
  • 除非您处于极度受限的内存条件下,或者需要存储数个 bajillion 这些,否则只需使用 int。如果你只允许编译器使用平台自然字长,你的代码会有更好的性能。

标签: c string enums


【解决方案1】:

你想要的是Bit Field:

typedef struct {
    unsigned char val : 2; //use 2 bits
    unsigned char : 6; // remaining 6 bits
} valContainer;

...

valContainer x;
x.val = GD;

请注意,实际上没有办法存储少于一个字节,因为字节的定义是计算机可以寻址的最小内存量。这只是一种将名称与字节中的不同位相关联的方法。

当然,2 位对于 6 个值是不够的(2 位包含 4 个不同的值)。所以你真的需要至少 3 位(8 个不同的值)。

【讨论】:

    【解决方案2】:

    只需将它们存储为无符号短。除非您在结构中存储其他内容以填写整个单词,否则您会过早地进行优化。无论如何,编译器都必须填充您的数据。

    【讨论】:

    • unsigned short 看起来很奇怪;也许unsigned char 或只是int?
    • 是的,任何类似的东西都可以正常工作。我不确定我为什么选择 unsigned short,我猜没有什么特别的原因。
    【解决方案3】:

    正如 Eric Finn 的回答所暗示的,您可以使用位域来存储 3 位的数据元素。但是,只有在同一个字节中有其他内容要存储时,这才有用。

    struct {
        unsigned char value: 3;
        unsigned char another: 4;
        unsigned char yet_another: 5;
        // 12 bits declared so far; 4 more "padding" bits are unusable
    } whatever;
    

    如果你想存储一个由许多这样的小元素组成的数组,你必须以不同的方式来做,例如,在每个 32 位字中聚集 10 个元素。

    int n = ...; // number of elements to store
    uint32_t *data = calloc(n / 10, sizeof(*data));
    for (int i = 0; i < n; i++)
    {
        int value = read_string_and_convert_to_int();
        data[i / 10] &= ~(7 << (i % 10 * 3));
        data[i / 10] |= value << (i % 10 * 3);
    }
    

    如果您只想拥有一个(或几个)元素,只需使用enum 或int。

    【讨论】:

      猜你喜欢
      • 2010-10-18
      • 1970-01-01
      • 2011-11-02
      • 2014-02-22
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      相关资源
      最近更新 更多