Какой используете компилятор? Обычно свитч сводится к тривиальному преобразованию для получения индекса, условию граничной проверки и переходу по адресу, выбираемому как индекс из массива, что, очевидно, (почти всегда) быстрее, чем дельфевский <value> in <set>.
Опять же, можно как обычно сделать все это "вручную", получая индекс по своему алгоритму, особенно если числа специфичные.
В данном случае
(0x7E7E, 0x3F3F, 0x9F9F, 0xCFCF, 0xE7E7, 0xF3F3, 0xF9F9, 0xFCFC), очевидно, что значимым является только один байт. Далее рассмотрим все значения в двоичном виде — замечаем, что _каждом_ все биты установлены, кроме 2-х рядом стоящих (для 0x7E мы имеем 01111110,что при циклическом сдвиге даст желаемый результат).
Итак, задача сводится к проверке, что в числе 6 бит установлено, а 2 — сброшено, причем эти 2 находятся в циклически соседних позициях.
Представим, что нам надо поподробнее.
1. Получить индекс первого сброшенного бита справа (ну, или, проинвертировав число, установленого — без разницы).
2. Проверить следующий бит (т.к. число состояит из 2-х одинаковых байт, то выход за границы байта в этом случае нам не страшен — 8-й бит будет равен 0-му). Если этот бит также сброшен (установлен) — тогда это искомое число.
Алгоритм _быстрого_ нахождения первого установленного (или сброшенного) бита смотреть
здесь или использовать BSF/BSR, но тут мы теряем переносимость.
Итак, в результате мы получаем в минимуме 3 сдвига, 3 сравнения и 3 сложения. Достаточно оптимально, не правда ли?
DV>Тогда как быть .... писать на ассме ? ... Почему-то использование switch генерит нерациональный код ?