我正在寻找一种小而快速(在两个方向上)的双射映射,将以下整数列表映射到范围为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,这些值与上面的值不兼容。
另一个明显的解决方案是查找表,但是如果没有使它变得不必要地大,查找表仍然需要一些位重新排列,我怀疑整个任务可以通过简单的位重新排列更好地完成。
对于好奇的人来说,这些神奇的数字是唯一出现在传统ISO-8859和Windows代码页中的“大” Unicode 代码点。