Эффективное отображение для определенного набора конечных целых чисел

Я ищу небольшое, быстрое (в обоих направлениях) биективное сопоставление между следующим списком целых чисел и подмножеством диапазона 0-127:

0x200C, 0x200D, 0x200E, 0x200F,
0x2013, 0x2014, 0x2015, 0x2017,
0x2018, 0x2019, 0x201A, 0x201C,
0x201D, 0x201E, 0x2020, 0x2021,
0x2022, 0x2026, 0x2030, 0x2039,
0x203A, 0x20AA, 0x20AB, 0x20AC,
0x20AF, 0x2116, 0x2122

Одно очевидное решение это:

y = x>>2 & 0x40 | x & 0x3f;
x = 0x2000 | y<<2 & 0x100 | y & 0x3f;

Изменить: Мне не хватало некоторых значений, в частности 0x20Ax, которые не работают с указанным выше.

Еще одно очевидное решение - таблица поиска, но без необходимости делать ее излишне большой, поиск таблица в любом случае потребует некоторой перестановки битов, и я подозреваю, что вся задача может быть лучше решена с помощью простой перестановки бит.

Для любопытных, эти магические числа - единственные "большие" кодовые точки Unicode, которые появляются в устаревших кодовых страницах ISO-8859 и Windows .

5
задан R.. 6 February 2011 в 07:18
поделиться