По сути, ваш флаг 64 целых числа, по одному на каждый бит длиной 64 бита, int.Во-первых, он, вероятно, должен unsigned
, поскольку вы можете иметь 1 << 63
(и, как сказал Натан Оливер 1LLU <<
).
31 равно 0x1F
, поэтому вы заставляете сдвиг быть меньше 31, поэтомучто с этим сдвигом нет проблем (в 32-битной версии все еще проблема с неподписанным IMHO).
Две операции, которые вы задаете после, являются совершенно разными операциями.Сдвиг j>>1
делается для удаления четных чисел, так как мы знаем, что это никогда не простые числа (см. j+=2*i
).
Итак, две вещи здесь:
(j>>1)&31
убирает поддержку четных чисел, так как при увеличении на 2*i
status[j>>6]
выбирается соответствующий элемент в массиве для j
.Но выбранное здесь значение неверно, так как в длинном длинном целом есть 8 байтов, а не 6. Также из-за предыдущего смещения я бы предположил, что вместо этого возможно значение 9.
редактировать: неправильное утверждение о status[j>>6]