您没有问这是否是一个好主意-正如许多人所建议的那样,您从这种空间压缩中获得的好处很容易在额外的处理中丢失-但这是另一个话题:)
您也没有提及之后将数据存储在哪里。无论存储位置/引擎是什么,都可能具有进一步的条件和专门的类型(例如,数据库具有二进制列格式,可能具有字节列格式,甚至可能支持位存储等)。
但坚持这个话题,我想最好的 3 位存储是一个半字节(腰围),我想我会将两个半字节组合成一个字节(整体丢失两位)。是的,您丢失了两位(如果这是关键的话),但是将这两个值组合起来很简单,因此您处理的开销相对较小:
$byte=$val1*7+$val2;
$val2=$byte%7;$val1=($byte-$val2)/7;
如果一个字节不可用,您可以将它们组合成 16(4 个存储)、32(8)、64(16)位整数。您还可以将这些值组成一个数组以进行更大的存储。
我认为上述内容更具人类可读性,但您也可以使用位逻辑来组合和分离这些值:
$combinedbyte=$val1<<3|$val2;
$val2=$combinedbyte&7;$val1=($combinedbyte&56)>>3);
(这实际上是 PACK/UNPACK 命令所做的)
或者,您可以编码成字符,因为在 ASCII 中前几个受到保护,您不妨从 A 开始(A-Z+6 punc+az 给您 58,而您只需要 49 来存储您的两个值)。
$char=chr(($val1*7+$val2)+65); //ord('A')=65
$val2=(ord($char)-65)%7;$val1=(ord($char)-65-$val2)/7;
一系列这些编码字符可以存储为数组或以空字符结尾的字符串。
注意:在上面的 -say- 64 位整数的情况下,我们将 3 位存储在 4 中,因此得到 64/4=16 个存储位置。这意味着我们要再增加 16 个位(每个位置 1 个),因此您可能会想再添加 5 个值,总共 21 个(21*3=63 位,仅浪费 1 个)。这当然是可能的(使用整数数学 - 尽管大多数 PHP 实例在 64 位或位逻辑解决方案中不起作用),但从长远来看它会使事情复杂化 - 可能比它的价值更麻烦。