Если каждый бит считать за нечетное число. Т.е. получается, что в решете храним только нечетные числа. Ну и инициализация у вас ооочень неэффективно делается. Ее можно ускорить в миллион :) раз (на больших числах). Короче, вот тут я сделал. https://pastebin.com/GzYA0Rj8
откуда в программе взялось (N+127)/128 и есть ли смысл в операции sizeof(uint64_t), если uint64_t гарантированно размером 64 бита, или гарантированно не менее 64 бит?
нет, смысла нет. Я хотел поставить 8 (т.е. 64 бита), но подумал, что так будет яснее :) (N+127)/128 - это целая часть сверху от N/128. Столько у нас кусков по 64 бита. Т.е. всего будет N/2 битов - именно столько нечетных чисел от 1 до N.