2015-10-11 10 views
2

Учитывая переменную int, я хотел бы проверить, является ли число «1» в его двоичном представлении четным или нечетным. Это может быть сделано с XOR операций, какОпределение четности числа 1 в переменной int

int n; 
int s = 0; 
for(;n;n>>=1) 
    s ^= (n&1); 

Там какая-то лучший способ сделать это в C++?

Примечание: Я не прошу количество «1», но для его паритета, поэтому я думал, что может быть какой-то лучший код, чем мой.

+0

Нет языка C/C++! Выбери один! – Olaf

+0

Что значит «лучше»: эффективнее? Легче понять при чтении кода ...? – jpo38

+1

Эффективное - время или память? –

ответ

5
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-битный вариант тоже.

Для уточнения с «четностью» я не имею в виду, если число равно или нечетно математически, но если количество двоичных представлений в двоичном выражении равно четному или нечетному; как описано в https://en.wikipedia.org/wiki/Parity_bit. С учетом математики код в вопросе не имеет смысла, поэтому я предположил, что OP означает то же самое. Заявление

Я не прошу для числа «1 ', а для паритета

то означает, что он/она просто хочет знать, если 1 счетчик четный или нечетный,
, но не точное число 1.

+1

Согласно вашей ссылке «Следующий метод вычисляет четность 32-битного значения» .... это не четность числа «1» в двоичном представлении числа .... это? – jpo38

+0

@ jpo38 Цитата из вопроса: 'Я хотел бы проверить, является ли число '1' в его двоичном представлении четным или нечетным.'. Это * - * четность значения (а не паритета popcount) – deviantfan

+0

Для меня «четность значения» заключается в том, чтобы знать, является ли это значение нечетным или даже ... нет, если это двоичное представление имеет нечетное или четное количество '1' ... но я, скорее всего, ошибаюсь (или я неправильно понимаю термины, английский не мой родной язык), потому что ваше решение работает ... ;-) – jpo38

1

Если вы действительно после скорости, вы можете подсчитать количество бит (или просто его четность) для всех байтовых значений 0..255. Затем сопоставляя объединение по переменной или используя shifts/masks, накапливаются для четырех байтов.

Еще быстрее и более параноидально, табулируйте все короткие значения 0..65535.