Битолюбство и микрооптимизации. Как при этом действительно их делать я не знаю.
Скажем вот, найти в строке первую цифру.
Можно просто chr >= '0' && chr <= '9' по каждому символу.
А можно попытаться воспользоваться побитовыми операциями над обычными регистрами как своего рода векторными инструкциями над упакованными байтами.
uint64_t word = *((uint64_t *)str);
uint64_t upper_bit_is_0 = ~word & 0x8080808080808080; // запоминаем, равен ли 0 старший бит символа
uint64_t reduced = word & ~0x8080808080808080; // сокращаем диапазон возможных значений байтов до 0--0x7f), чтобы можно было векторно сделать вычитание
reduced ^= 0x3030...; // '0' -- это 0x30, '9' -- это 0x39, меняем поисковой диапазон с 0x30--0x39 на 0x00--0x09.
uint64_t has_digit = (0x8989... - reduced) & upper_bit_is_0; // если верхний бит символа равен нулю, а нижние биты символа в нужном диапазоне, устанавливаем верхний бит в 1
uint64_t which = lzcnt(has_digit) >> 3; // по количеству ведущих нулевых битов в маске понимаем, который символ оказался цифрой
str += which;
if(which < 8)
return str;
else
goto новый_цикл;
Чтобы такое работало нужно, чтобы до '\0' гарантированно нашлась цифра. Но можно параллельно и '\0' искать таким же образом и по-and'ить c has_digit. Кажется, strchr реализован похожим образом для некоторых архитектур. https://elixir.bootlin.com/glibc/glibc-2.35/source/sysdeps/aarch64/strchr.S Там явно какая-то теория замешана; то, что у меня поименовано which, они называют syndrome, явно специализированный термин. Но где про такую магию почитать? В университете не про такое рассказывали.
Меж тем, это пока поиск символа или целостного их диапазона. Что насчёт [a-zA-Z]? можно ли каким-то образом сложить простанство символов, чтобы диапазоны a-z и A-Z совпали? А если вместо [a-zA-Z] там что-то совсем не continuous? Описан ли алгоритм, который для произвольного содержимого [] генерирует эффективную программу поиска символа, работающую по указанному принципу? ЕМНИП, в движках для регулярок jump таблицы используются, а не это вот, но там и запросы сложнее.