My solution (for every bit of the input block, there is such a line):
*parity ^= (((x[0] >> 30) & 0x00000001) * 0xc3e0d69f);
All types are uint32. This line takes the second bit of the input x, shifts it to the LSB and sets all other bits to zero. Then, the 32-bit parity is XORed with the corresponding parity set for this bit.
I found that this multiplication solution is the fastest way to do this conditional XOR. Is there a faster way?
I do not completely understand what kind of parity you mean, but if this line of code is doing that you want, it may be improved.
General rule: for x in {0, 1} x * N == -x & N
this because -x for 0 is all bits reset and for 1 is -1 in which all bits set.
So original line of code may be rewritten as:
*parity ^= (-((x[0] >> 30) & 0x00000001) & 0xc3e0d69f);
What two operations computed in less time than multiplication on many microprocessors, but you should check this.
Also code may take advantage of signed shift right
*parity ^= (((int32_t)x[0] << 1 >> 31) & 0xc3e0d69f);
First shift rshifts 30th bit into 31st, which is sign bit, and then second extend sign bit on all others as shift right on most machines act as floor(x / 2N), thus fill shifted in bits with sign bit (abc...yz>>3 == aaaabc...yz
).
But these tricks are stated as undefined behaviour in C standard and thus not portable. Use them carefully.