如何对C中单个数字的所有位进行XOR?

use*_*959 2 c xor

是否有一种简单的方法可以将单个数字的所有位进行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)

chu*_*ica 7

简化的 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)


Ale*_*ece 5

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位整数中的设置位数?对于计数设置位的数量有一些很棒的解决方案。