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