Учитывая переменную типа int, я хотел бы проверить, является ли число «1» в его двоичном представлении четным или нечетным. Это можно сделать с помощью операций xor, таких как
int n;
int s = 0;
for(;n;n>>=1)
s ^= (n&1);
Есть какой-то лучший способ сделать это в C ++?
Замечания: Я спрашиваю не о количестве единиц, а о его четности, поэтому я подумал, что может быть код получше, чем мой.
uint32_t v = somevalue;
v ^= v >> 1;
v ^= v >> 2;
v = (v & 0x11111111U) * 0x11111111U;
bool parity = (v >> 28) & 1;
От https://graphics.stanford.edu/~seander/bithacks.html
У него тоже есть 64-битный вариант.
Для пояснения, с «четностью» я не имею в виду, является ли число четным или нечетным математически, но если число 1 бит в его двоичном представлении является четным или нечетным; как описано в https://en.wikipedia.org/wiki/Parity_bit. С математическим значением, код в вопросе не имеет смысла, поэтому я предположил, что OP означает то же самое. Заявление
Я спрашиваю не о количестве единиц, а о его соотношении
то означает, что он / она просто хочет знать, является ли счет 1 четным или нечетным,
но не точное число 1.
Если вы действительно стремитесь к скорости, вы можете табулировать количество бит (или только его четность) для всех значений байтов 0..255. Затем, отображая объединение на переменную или используя сдвиги / маски, накапливаем четыре байта.
Еще быстрее и более параноидально, табулируйте для всех коротких значений 0..65535.