2017-01-17 41 views
0

在嵌入式系统中,我仅限于使用长度仅为1个字节(0-255,然后回滚到0)的数组索引。该数组不断获得额外的条目,但数组的总长度是固定的,并且小于255(比如说5)。旧值将被覆盖或“弹出”(FIFO堆栈)。正确的排序顺序和1字节索引翻转

通常,最近的第一个(或最后一个)的排序顺序只是数组索引(7,8,9,10,11或17,18,19,20,21或124,125,126,127,128等)的数字排序)。

除了当索引达到255时,它会翻转。现在,值看起来像

253,254,255,0,1或254,255,0,1,2

在这种情况下,简单的数字顺序(0,1,253,254,255 )不是最近的第一次(或最后一次)排序。

什么是在这种情况下找到正确排序顺序的优雅方式?

+0

从Honza的回应中,一旦检测到翻转,我将所有数字视为1字节2的补码。现在254变成-2,255变成-1,而1保持1,2,保持2.索引顺序是最近顺序! – PVS

回答

1

您需要以某种方式检查“滚动”情况(整数溢出)并进行补偿(执行更正)。

检查可能溢出:

  1. 还有就是数组中的元素比我的大,比方说,240
  2. 你保持addedremoved布尔标志与阵列。您将它们初始化为相同的值。当索引为0的项目添加到阵列时,您翻转added。当索引为255的项目从阵列中删除时,您翻转removed。如果它们的值相等,则会发生溢出。

补偿:

  1. 型投你的价值观signed char(或int8_t)。对于127-128左右的索引不起作用,但是由于你的数组很小,所以你应该是安全的。
  2. 创建一个临时数组并减去或添加128将值移到值范围的中间,在这里可以比较它们的位置。同样的警告适用。
0

该代码可以跟踪1个字节的起始索引和1个字节的结束索引。在1字节索引上使用二进制补码数学(结束索引) - (起始索引)==数组大小。环绕不会是一个问题。