Есть два вектора разных, но связанных размеров. Чем больше (2 * RESOLUTION) + INDEX_OFFSET
(например, 2050) и меньший просто RESOLUTION
(например, 1024). Я считаю, что достаточно безопасно предположить, что uint16_t
может использоваться для содержания векторного индекса.
Итерация по большему вектору выполняется путем увеличения resultIndex
на 2. Во время каждой итерации присваивается меньший вектор в индексе (resultIndex - INDEX_OFFSET) / 2
,
По сути, код опирается на предположение, что, будь то INDEX_OFFSET
Нечетное или четное, приведенное выше деление на 2 всегда будет округляться, независимо от архитектуры. Например, если resultIndex
0 или 1, то ожидается 0, если 2 или 3, то 1 ожидается, и так далее. Это безопасное предположение, в рамках параметров выше?
Нотабене Я признаю существование «Деление целочисленных типов — предсказуемы ли результаты?» но это не похоже на точное совпадение.
Да; это гарантируется языком:
[C++11: 5.6/4]:
Бинарный/
оператор дает частное, а двоичный%
Оператор возвращает остаток от деления первого выражения на второе. Если второй операнд/
или же%
ноль, поведение не определено. Для интегральных операндов/
оператор дает алгебраический фактор с любой отброшенной дробной частью; если частноеa/b
представимо в типе результата,(a/b)*b + a%b
равноa
,
В 3/2
, и то и другое 3
а также 2
являются интегральными операндами; алгебраический фактор этой операции 1.5
и когда вы отбрасываете дробную часть .5
, ты получаешь 1
, Это относится и к другим вашим примерам, а также ко всем остальным примерам.
Других решений пока нет …