是否有一种简单的方法可以将单个数字的所有位进行XOR运算,即C中的一元XOR?
具有以下作用的东西:
result = ^(0x45); // ( 0 ^ 1 ^ 0 ^ 0 ^ 0 ^ 1 ^ 0 ^ 1 = 1)
result = ^(0x33); // ( 0 ^ 0 ^ 1 ^ 1 ^ 0 ^ 0 ^ 1 ^ 1 = 0)
Run Code Online (Sandbox Code Playgroud)
简化的 O(log2(n)) 方法。
#include <limits.h>
int odd_parity(unsigned v) {
#if (UINT_MAX > 0xFFFFFFFFFFFFFFFFu)
v ^= v >> 64; // Prepare for the future
#endif
#if (UINT_MAX > 0xFFFFFFFFu)
v ^= v >> 32;
#endif
#if (UINT_MAX > 0xFFFFu)
v ^= v >> 16;
#endif
v ^= v >> 8;
v ^= v >> 4;
v ^= v >> 2;
v ^= v >> 1;
return (int) (v&1);
}
Run Code Online (Sandbox Code Playgroud)
GCC对此具有内置功能:
int xor_bits(unsigned x) {
return __builtin_parity(x);
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以通过计算设置的位数来计算奇偶校验。为此内置的gcc是__builtin_popcount():
int xor_bits(unsigned x) {
return __builtin_popcount(x) & 1;
}
Run Code Online (Sandbox Code Playgroud)
如果您只想坚持使用标准C,请访问https://graphics.stanford.edu/~seander/bithacks.html以及如何计算32位整数中的设置位数?对于计数设置位的数量有一些很棒的解决方案。