2017-01-17 4 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. ,의 말을하자
  2. 240 당신은 배열 addedremoved 부울 플래그를 유지 :

    가능한 오버 플로우에 대한 확인. 동일한 값으로 초기화합니다. 인덱스가 0 인 항목을 배열에 추가하면 added을 바꿉니다. 배열에서 색인이 255 인 항목을 제거하면 removed을 바꿉니다. 값이 같으면 오버플로가 생깁니다.

보상 :

  1. signed char (또는 int8_t)에 값을 입력은 캐스팅. 127-128 주위의 인덱스에서는 작동하지 않지만 어레이가 작기 때문에 안전해야합니다.
  2. 임시 배열을 만들고 128을 빼거나 더하여 값 범위의 가운데로 값을 이동하면 비교할 수 있습니다. 동일한주의 사항이 적용됩니다.
0

코드는 1 바이트 시작 인덱스와 1 바이트 종료 인덱스를 추적 할 수 있습니다. 1 바이트 인덱스에서 2의 보수 수학을 사용하여 (끝 인덱스) - (시작 인덱스) == 배열 크기. 랩 어라운드는 문제가되지 않습니다.