如何将字符串存储到位以减少内存占用

时间:2011-10-18 06:47:10

标签: c string bit-manipulation

我有一个charater指针数组指向一些搅拌

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

例如

我有字符指针,存储字符串,如“100110”,所以它需要6个字节来存储,但我想将其存储在位中,所以我减少了内存。

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

在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')

答案 2 :(得分:0)

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

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

==> i=21

答案 3 :(得分:-1)

一种方法是,将char* []定义为全局,使用其索引进行访问:

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

<强>用法:  而不是

char *p = stringLiteral[3];

使用

unsigned int idx = 3;

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

另外,如果字符串大小是>然后,32个字节,您将无法将其存储在一个32位int中。