【发布时间】:2011-05-23 22:30:02
【问题描述】:
让我从一些背景开始:
通过“tribool”,我理解一个变量,它可以包含以下值之一:true、false 或 null。
在问题 Copying array of ints vs pointers to bools 中,OP 希望拥有一个尽可能小的 tribools 数组(或多或少)。
通过“一点”最基本的位符,我想出了一个解决方案,每个 tribool 使用 2 位,并允许将 OP 的 64 个 tribool 数组存储在 16 个字节中,这没关系。
我使用的 tribool 机制很简单,例如:
- boolean A 表示“null or not null”,
- boolean B 表示“如果不为空,则为真或假”。
但后来我想……“位”的算法定义是:
位是信息量,它指定两个同样可能的事件中的哪一个将发生。
显然,真/假值是 1 位大。两个真假值作为一个整体是 2 位大。
那么我们的概念 tribool 呢?
我的观点是:就包含信息的大小而言,三元组大于 1 位但小于 2 位。
- 理由 1:假设我们如上所述实现了 if 布尔值。如果 boolean A 为“null”,则 boolean B 的值是多余的,不携带任何相关信息。
- 理由 2:不可能将来自 2 个独立布尔值的信息存储在一个 tribool 中,因此它具有
(以上都不是正式的证明,但我相信我们可以同意triool的“大小”严格大于1位并且严格小于2。)
我的问题是:
如何以编程方式利用 tribool 的信息少于 2 位这一事实,并在软件中实现(c、c++?)一个包含 N 个 tribool 的数组对于某些 N,内存占用小于 N/4 字节?
是的,我确实理解这样的实现对硬件并不友好,并且会比任何具有冗余的常见解决方案(如 OP 的问题中提出的那些)慢。让我们只优化空间,而不是效率。
显然,这个实现需要一个与一对布尔值不同的 tribool 表示(如前所述,它本身是多余的)。理论上说有可能实现这个目标,我希望看到一个实际的实现。有什么想法吗?
【问题讨论】:
-
空间上的优化肯定会以时间为代价。但是,是的,这是可能的。
-
当然 :) 我最感兴趣的是解决此类问题的方法。虽然这可能不是 bit-fu 最可行的用法,但问题本身似乎很有趣,并且就在现实生活中解决类似问题的经验而言,答案将非常有价值。
标签: c++ c optimization bit-manipulation