Поскольку каждый символ разделителя составляет 8 бит (sizeof(char)
== 1 байт), он ограничен 256 возможными значениями.
Словарь разбит на 8 частей (int dictionary[8]
), 32 варианта на единицу (sizeof(int)
is> = 4 байта) и 32 * 8 = 256.
Это формирует 256-битную матрицу значений. Затем он включает флаг для каждого символа в разделителе (dictionary[*delim / 32] |= 1 << *delim % 32;
). Индекс массива равен *delim / 32
, или значение ASCII символа, разделенное на 32. Поскольку значение ASCII варьируется от 0 до 255, это деление дает значение от 0 до 7 с остатком. Остаток, какой бит включить, определяется операцией модуля.
Все, что это делает, - помечает определенные биты 256-битной матрицы как истинные, если соответствующий символ ASCII существует в разделителе.
Определение того, находится ли символ в разделителе, - это просто поиск в 256-битной матрице (dictionary[*start / 32] & 1 << *start % 32
)