Я пытаюсь найти четность битовой строки, чтобы она возвращала 1, если x имеет нечетное количество нулей.
Я могу использовать только основные побитовые операции, и то, что у меня есть, проходит большинство тестов, но я интересно 2 вещи:
Почему x ^ (x + ~1) работает? Я наткнулся на это, но, похоже, он дает вам 1, если есть нечетное количество бит, и что-то еще, если четное. Как 7^6 = 1, потому что 7 = 0b0111
Это правильное направление решения проблемы для этого? Я предполагаю, что моя проблема связана с первой операцией, в частности (x + ~ 1), потому что она переполнит определенные дополнительные числа 2. Спасибо
Код:
int bitParity(int x) {
int first = x ^ (x + ~1);
int second = first ^ 1; // if first XOR gave 1 you'll return 0 here
int result = !!second;
return result;
}
int
, будет переполнение, и тогда это поведение undefined. Вместо этого используйтеunsigned
и1u
, здесь перенос четко определен. - person Jens Gustedt   schedule 23.09.2011