我在闪存中有一个16位字段,用来存储8位数字(更具体地说,是0到254之间的闭合范围内的值)。我想使用额外的8+位进行错误检查(不需要纠错),最明显的方法是简单地重复值两次。XMODEM包编号方法稍微不那么明显:将数字存储在第一个八位字节中,255减去第二个八位字节中的数字。
有没有更好的选项可以在可用空间中提供更强大的错误检测,并且易于实现和快速执行?或许可以利用这样一个事实,即闪存位更可能从1变为0,而不是从0变为1?

最佳答案

请注意:我认为xmodem方法是合理的,所以我会接受它并着手处理更重要的事情。不管怎样,你用算法标记了这个问题,所以你也可以用一种方法来证明这个…
由于您需要错误检测,最重要的部分是可以检测到单个位的任何更改,因此数字的两个表示不能仅相差一个位,最好它们尽可能地相差很远。此外,并非每一个变化都有可能发生。
如果将其建模为一个图,则将得到由16位数字标识的顶点以及定义该转换概率的两个顶点之间的定向边这将是一个完整的图形,所以请考虑如何存储它(如果您完全存储它,而不是按需计算它)你现在正在寻找的是一个精确的255个顶点的圆形路径,它具有最大的重量。
为此,只需搜索任何带有255个顶点的圆形路径,使用倾向于重边的dfs。从这个圆中,取其最轻的边并从图中移除所有不重的边。然后,重复搜索结果中的图形(可能已断开连接!)图表,直到你找不到为止。
最后,将输入值映射到剩余圆的顶点id,以将其存储在闪存中。

10-08 04:06