只有四种状态的小格子可以用两位表示,一字节容纳四个。修改其中一个格子时,需要只替换对应的两位,不能把整字节直接改成新状态值。
十二格依次装入三个字节,每格状态为零到三。每个字节中编号较小的格子放低两位,依次使用权重一、四、十六、六十四。改值先清除目标两位,再放入新状态,其他格子不变。
初始十二格[3, 3, 1, 3, 3, 3, 2, 0, 3, 2, 0, 1] 初始三个字节[223, 47, 75]
修改1:格1写成1,位于字节0从低位数偏移2位;字节由[223, 47, 75]变为[215, 47, 75],读回逻辑十二格[3, 1, 1, 3, 3, 3, 2, 0, 3, 2, 0, 1]。
修改2:格7写成3,位于字节1从低位数偏移6位;字节由[215, 47, 75]变为[215, 239, 75],读回逻辑十二格[3, 1, 1, 3, 3, 3, 2, 3, 3, 2, 0, 1]。
修改3:格8写成0,位于字节2从低位数偏移0位;字节由[215, 239, 75]变为[215, 239, 72],读回逻辑十二格[3, 1, 1, 3, 3, 3, 2, 3, 0, 2, 0, 1]。
修改4:格7写成3,位于字节1从低位数偏移6位;字节由[215, 239, 72]变为[215, 239, 72],读回逻辑十二格[3, 1, 1, 3, 3, 3, 2, 3, 0, 2, 0, 1]。
修改5:格3写成0,位于字节0从低位数偏移6位;字节由[215, 239, 72]变为[23, 239, 72],读回逻辑十二格[3, 1, 1, 0, 3, 3, 2, 3, 0, 2, 0, 1]。
修改6:格6写成3,位于字节1从低位数偏移4位;字节由[23, 239, 72]变为[23, 255, 72],读回逻辑十二格[3, 1, 1, 0, 3, 3, 3, 3, 0, 2, 0, 1]。
修改7:格3写成2,位于字节0从低位数偏移6位;字节由[23, 255, 72]变为[151, 255, 72],读回逻辑十二格[3, 1, 1, 2, 3, 3, 3, 3, 0, 2, 0, 1]。
修改8:格6写成0,位于字节1从低位数偏移4位;字节由[151, 255, 72]变为[151, 207, 72],读回逻辑十二格[3, 1, 1, 2, 3, 3, 0, 3, 0, 2, 0, 1]。
修改9:格6写成1,位于字节1从低位数偏移4位;字节由[151, 207, 72]变为[151, 223, 72],读回逻辑十二格[3, 1, 1, 2, 3, 3, 1, 3, 0, 2, 0, 1]。
每次操作只替换一个两位字段。写入值与原值相同也属于有效的空变化,不能因此移动后面格子的位序或改变字节长度。
可以用位运算实现写入,再用除以四的幂并对四取余的方法独立读回。每次修改后,都应核对十二格是否与逻辑状态一致,并检查非目标格没有发生变化。
建议先遮住结果,用本例原始输入独立完成一遍,再逐项对照。若出现差异,先找最早不一致的位置,检查索引从零还是从一开始、边界是否包含,以及比较或更新发生的先后。只比较最后一个数,往往无法分辨规则理解与计算步骤分别出了什么问题。
这里只压缩状态编号,颜色或地形含义需要另一张表解释。位序是本例自定的格式约定,跨工具读取时必须一致;改变一位的含义可能影响很多格子,因此格式版本也应明确。