【问题标题】:How to store String in to bits for reduce memory occpuied如何将字符串存储到位以减少内存占用
【发布时间】:2023-03-21 18:29:01
【问题描述】:

我有一个字符指针数组,它指向一些搅拌

每个元素都指向一些字符串 记住一件事,字符串只有 1 和 0。

例如

我有一个字符指针,它存储像“100110”这样的字符串,所以它需要 6 个字节来存储,但我想把它存储在位中,所以我减少了内存占用。

【问题讨论】:

  • C 还是 C++?它们是两种不同的语言。
  • << 运算符应该可以帮助您。
  • 看看这里:stackoverflow.com/questions/688314/…>
  • 在 C 中 .. 但是

标签: c string bit-manipulation


【解决方案1】:

在 C 风格中,这样的东西应该可以工作:

char* str = "100101";
unsigned out = 0;

for (int i = 0; str[i]; i++) {
   out = (out << 1);
   if (str[i] == '1')
      out++;
}

(暂时无法测试,如有错误请指正)

说明:

str = "100101"
out = 0000 0000 0000 0000

i = 0:
   out = 0000 0000 0000 0000 (out << 1)
   out = 0000 0000 0000 0001 (out++ because str[0] == '1')

i = 1:
   out = 0000 0000 0000 0010 (out << 1)

[...]

i = 5:
   out = 0000 0000 0010 0100 (out << 1)
   out = 0000 0000 0010 0101 (out++ because str[5] == '1')

【讨论】:

  • 我会测试的。这里 unsigned out 是 char??
  • unsigned 用于unsigned int,根据你的字符串长度使用你想要的类型
  • 我可以使用 unsigned char out = 0;
  • an unsigned char 是 1 字节(8 位)
  • 我想在编码后实现霍夫曼编码算法我想将每个字符的编码值存储到某个地方并减少内存
【解决方案2】:

您是否尝试过 STL bitset 容器?它针对这个目的进行了优化。或者,创建bool 元素的vector 将在内部打包位以节省空间。

【讨论】:

  • 告诉我更多关于dis的描述??
【解决方案3】:

为什么不使用“strtol”?这是一个标准的 lib 函数。 或者您正在为内存不足的硬件编写低级代码?

char *str = "010101";
int i = strtol(str ,(char**)NULL ,2);

==> i=21

【讨论】:

    【解决方案4】:

    一种方法是将char* [] 定义为全局变量并使用其索引 来访问它:

    char stringLiterals [] =  { "0101010", "10010010", "111", "010100100", ... };
    

    用法: 而不是

    char *p = stringLiteral[3];
    

    使用

    unsigned int idx = 3;
    

    基本原理:如果您将此字符串压缩成位以用于序列化目的,那就没问题了。但除此之外,我看不到任何压缩它们的用例。在我上面的解决方案中,它不使用任何额外的内存。你已经有一个字符串字面量数组;我只是要求在全局范围内声明并使用它的索引。

    此外,如果字符串大小 > 32 字节,则您将无法将其存储在单个 32 位 int 中。

    【讨论】:

    • 我不想访问我想以位存储“0101010”字符串。而不是字节
    • @SaurabhPatel,是的,我确实明白了你的问题。我的回答建议您代码中的最终可用性。您将"010101" 存储在某处,然后为了使用它,您再次将其转换回"010101"。取而代之的是,您可以简单地将该字符串文字存储到一个数组中并获取它的索引。这相当于将"010101"转换为单个int。如果您处理序列化数据,那么此技术很有帮助。我假设您想隐藏字符串文字而不是某些变量的内容,在后一种情况下,您必须使用 vector 而不是数组
    • @downvoter,请在上面的评论中查看我的答案背后的理性。如果我遗漏了什么,请解释一下。
    • @iammilind:“但是我想将它存储在位中,所以我减少了内存占用”(来自它的问题)。我读了你的回答大约 5 次,以模糊理解你的观点......
    • @Simon,在这里它不会占用任何内存。因为他只是在访问已经存储的字符串文字的索引。除了学习目的(或序列化)之外,我没有发现任何将这些文字存储到位中的用例。此外,字符串长度很可能是 &gt; 32 字节,并且 OP 将无法将其存储在单个 32 位 int 中。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    相关资源
    最近更新 更多