Я не совсем понимаю, какой именно паритет вы имеете в виду, но если эта строка кода делает то, что вы хотите, ее можно улучшить.
Общее правило: для x в{0, 1} x * N == - x & N
это потому что -x для 0все биты сброшены, а для 1 - -1, в котором все биты установлены.
Таким образом, исходная строка кода может быть переписана как:
*parity ^= (-((x[0] >> 30) & 0x00000001) & 0xc3e0d69f);
Какие две операции вычислены за меньшее время, чем умножениена многих микропроцессорах, но вы должны проверить это.
Также код может воспользоваться преимуществом сдвига со знаком вправо
*parity ^= (((int32_t)x[0] << 1 >> 31) & 0xc3e0d69f);
Первое смещение rshifts 30-й бит в 31-й, который является знаковым битом, а затем второйрасширить знак бита на всех остальных, так как смещение вправо на большинстве машин действует как пол ( x / 2 N ), таким образом, заполненный сдвинутый бит в знаке бит (abc...yz>>3 == aaaabc...yz
).
Но эти уловки определены как неопределенное поведение в стандарте C и, таким образом, не переносимо .Используйте их осторожно.