arrays - 如何以最轻的大小在文件中存储大量 boolean 值?

标签 arrays file save boolean stream-compaction

我的程序生成充满 boolean 值的大型数组。 我需要最紧凑的方式将它们保存在文件中。

我在这里读到http://www.kirupa.com/forum/showthread.php?339670-How-is-boolean-represented-in-memory内存中的 8 个 boolean 值可以表示为单个字节,因此单个 boolean 值是单个位。 但是我如何将这些 boolean 值数组保存到一个文件中?我知道 - 文件写入函数是用字节而不是位进行操作的。

简单来说 - 我希望能够将 boolean 数组保存到文件中,其大小比 Array.Length 小 8 倍

最佳答案

我认为您正在使用 C++ 进行编码,因为您发布的链接指向 C++ 论坛?

您可以使用位掩码和位操作,其中每个 boolean 值位于字节的某个位。因此,您可以使用一个字节(uint8)来存储8个 boolean 值。这是相当低级的,我曾经在用 C 编码且存储是一个大问题时这样做。

如果你真的想走这条路,你最好将下面的操作隐藏在一些更高级别的读/写和设置/重置函数中。将 boolean 值转换为字节后(您现在有一个字节数组!),您可以简单地将它们写入二进制文件,如here所述。 .

以下是有关如何将 boolean 值转换为字节的一些提示: 您可以为您感兴趣的每个 boolean 值创建掩码,以指定它们将在字节中的哪个位置写入/读取。

我使用十六进制数字是为了更好的可读性。

例如:

uint8 bitFlags = 0x00; // empty mask  0000 0000

uint8 maskA = 0x01;    // first bit:  0000 0001
uint8 maskB = 0x02;    // second bit: 0000 0010

要设置变量,请使用按位或(保留所有其他位,但设置您感兴趣的位:

bitFlags = bitFlags | maskA;

读取变量:

bool isTrueA = ( bitFlags & maskA ) > 0 ; // bitwise AND, result is 1 if bit is set, 
                                          // 0 otherwise

重置变量:

bitFlags = bitFlags & (!maskA);           // bitwise AND with inverse mask: 1111 1110
                                          // forces position of A to be zero

有关位掩码使用的更多信息可以参见 here .

关于arrays - 如何以最轻的大小在文件中存储大量 boolean 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17131087/

相关文章:

java - java中排序哪个字符串更大,数组

django - 如何在 Django 开发中提供静态文件

php - 在 HTML 文件中导出 PHP 表

php - 浏览数组并插入 SQL - php(奇怪的数组结构)

javascript - 格式化 JavaScript 函数以将匹配项映射到时间组

java - OS X 中 Java 7 文件名的编码问题

Python:读取文件时创建各种文件对象

CakePHP - 保存失败;验证错误为空

image - 将谷歌图表另存为图像

php - 如何显示表格中的每个数据