Busco un pequeño, rápido (en ambas direcciones) biyectiva entre la siguiente lista de números enteros y un subconjunto del rango 0-127:asignación eficiente para un entero finito particular, establece
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
Una solución obvia es:
y = x>>2 & 0x40 | x & 0x3f;
x = 0x2000 | y<<2 & 0x100 | y & 0x3f;
Editar: me estaba perdiendo algunos de los valores, en particular 0x20Ax, que no funcionan con lo anterior.
Otra solución obvia es una tabla de búsqueda, pero sin hacerla innecesariamente grande, una tabla de búsqueda requeriría alguna reorganización de bit de todos modos y sospecho que la tarea completa se puede lograr mejor con una reorganización de bit simple.
Para los curiosos, esos números mágicos son los únicos puntos de código Unicode "grandes" que aparecen en las páginas de códigos heredadas ISO-8859 y Windows.
http://en.wikipedia.org/wiki/Quine%E2%80%93McCluskey_algorithm –
por cierto, un biyectiva en un subconjunto se llama inyectiva;) – Christoph