Для того, чтобы склеить несколько Unicode-codepoint-ов в один символ, нужно знать какие символы имеют свойство Grapheme_Extend = Yes, а какие нет (точнее другое свойство - Grapheme_Cluster_Break=Extend).
(http://unicode.org/reports/tr44/).

Всего в Unicode codepoint-ов 1 114 112,
https://en.wikipedia.org/wiki/Code_point

Если хранить по одному биту на каждый codepoint, то нужно 139264 байт.

Можно составить список символов с установленным свойством, их примерно 1610 штук (с Grapheme Extend)

Вроде бы в процессоре Intel были какие-то команды для работы с битовыми массивами.

Начиная с 80386 процессора:
The Bit Test Instructions: BT, BTS, BTR, and BTC
you can use the bt instruction (bit test) to test a single bit. Its second operand specifies the bit index into the first operand. Bt copies the addressed bit into the carry flag.
[html]
<a href="https://stackoverflow.com/questions/7508049/bt-assembly-instruction">https://stackoverflow.com/questions/7508049/bt-assembly-instruction</a>
[/html]

[html]
<a href="https://en.wikipedia.org/wiki/Bit_Manipulation_Instruction_Sets">https://en.wikipedia.org/wiki/Bit_Manipulation_Instruction_Sets</a>
<br />
<a href="https://software.intel.com/en-us/blogs/2013/05/17/processing-arrays-of-bits-with-intel-advanced-vector-extensions-2-intel-avx2">https://software.intel.com/en-us/blogs/2013/05/17/processing-arrays-of-bits-with-intel-advanced-vector-extensions-2-intel-avx2</a>
<br />
<a href="https://software.intel.com/en-us/blogs/2014/07/24/processing-arrays-of-bits-with-intel-advanced-vector-extensions-512-intel-avx-512">https://software.intel.com/en-us/blogs/2014/07/24/processing-arrays-of-bits-with-intel-advanced-vector-extensions-512-intel-avx-512</a>
<br />
<a href="https://software.intel.com/en-us/forums/intel-isa-extensions/topic/530405">BEXTR intrinsic incompatible with GCC</a>
[/html]

Можно, конечно и по-старинке сделать, со сдвигами и масками, но так не интересно.

Есть инструкция BEXTR
https://www.felixcloutier.com/x86/bextr
которая может извлечь несколько битов из памяти в регистр
BMI1 is available in AMD's Jaguar, Piledriver and newer processors, and in Intel's Haswell and newer processors.
https://en.wikipedia.org/wiki/Bit_Manip … n_Set_1.29
Релиз первых процессоров на архитектуре Haswell состоялся 1—4 июня 2013 года на COMPUTEX 2013

Это должно позволить создать массив, в котором каждый элемент занимает ровно 21 бит (а не 32 и не 64).
21 бит * 1610 штук ~= 4227 байт (две страницы памяти, если они по 4 килобайта)

Идея такая - в выполняемом файле держать эту таблицу, при загрузке преобразовывать его в массив по биту на символ (для скорости последующей обработки).

Можно было бы перечислить только расширяющие символы, относящиеся к русскому языку (будет их меньше 10 штук), но так не интересно.

А так вообще, вроде-бы такие символы группируются в блоки, и можно попробовать сжать при помощи RLE (начало блока + длина).

Отредактировано Лис (2019-04-03 04:31:48)