如何在数值变量限制下高效存储二进制网格并实现双向转换
二进制网格高效存储方案
单变量最大容量测算
首先明确两类变量的最大可存储bit数,测算逻辑为取不超过变量最大值的最大2的整数次幂对应的指数:
- int变量:上限9999999,
2^23=8388608 < 9999999 < 2^24=16777216,因此单个int最多可存储23个bit,对应数值范围0~8388607,完全符合取值限制,运算过程也不会溢出。 - float变量:上限999999.99,换算为最小单位0.01的整数等价于上限99999999,
2^26=67108864 < 99999999 < 2^27=134217728,因此单个float最多可存储26个bit,对应存储值为整数结果除以100,最大值为67108863/100=671088.63,远小于float限制,单位容量比int高13%,优先选择。
编码(网格转存储数值)步骤
- 提前约定网格的bit序列化规则,比如按逐行从上到下、每行从左到右的顺序,把每个网格点的1/0状态拼接成连续二进制串。
- 按单变量最大bit数拆分二进制串,不足位数的组末尾补0。
- 每组二进制数转十进制整数:
- 用float存储的话,直接将整数除以100存入变量即可。
- 用int存储的话,直接将整数存入变量即可。
- 需要扩容的话按上述规则拆分到多个变量存储即可。
解码(数值还原网格)步骤
- 读取存储变量:
- float变量先乘以100取整,得到原始整数结果。
- int变量直接读取数值即可。
- 将整数转成固定长度的二进制串,不足位数的话前面补0到对应单变量bit数。
- 把所有变量对应的二进制串按存储顺序拼接,再按之前约定的序列化规则拆分成对应行列的网格,即可还原原始数据。
示例验证
以你给出的3行5列网格为例:
1 0 0 1 1 1 1 0 1 1 1 1 1 1 1
按行优先序列化得到二进制串100111101111111,转十进制为20351,用int存储直接存20351即可,用float存储则存203.51,解码时均可100%还原原始网格。
注意事项
所有运算过程按组处理,单组数值最大不超过8388607(int)或67108863(float转整数后),不会触发9999999的运算溢出限制。
内容的提问来源于stack exchange,提问作者Night
相关产品推荐
相关产品推荐

