C 将32位整数与其自身进行异或运算

C 将32位整数与其自身进行异或运算,c,bitwise-operators,C,Bitwise Operators,我一直在用32位整数本身进行异或运算。我应该对整数的4个8位部分进行异或运算。我知道它是如何工作的,但如果不将整数存储在任何地方,我就不知道如何执行此操作 我已经仔细考虑过了,我正在考虑使用二进制左移位和右移位运算符将32位整数分成4个部分进行异或运算。例如,如果我使用8位整数,我会这样做: int a = <some integer here> (a << 4) ^ (a >> 4) 要累积8位值的XOR,只需对值的每个部分进行移位和XOR。概念上是这样的

我一直在用32位整数本身进行异或运算。我应该对整数的4个8位部分进行异或运算。我知道它是如何工作的,但如果不将整数存储在任何地方,我就不知道如何执行此操作

我已经仔细考虑过了,我正在考虑使用二进制左移位和右移位运算符将32位整数分成4个部分进行异或运算。例如,如果我使用8位整数,我会这样做:

int a = <some integer here>
(a << 4) ^ (a >> 4)

要累积8位值的XOR,只需对值的每个部分进行移位和XOR。概念上是这样的:

uint32_t checksum = ( (a >> 24) ^ (a >> 16) ^ (a >> 8) ^ a ) & 0xff;
但是,由于XOR可以按任何顺序执行,因此您可以用更少的操作来执行相同的操作:

uint32_t checksum = (a >> 16) ^ a;
checksum = ((checksum >> 8) ^ checksum) & 0xff;
如果你在许多价值观上这样做,你可以通过在最后压缩价值观来扩展这个想法。这与使用SIMD等技术在较大寄存器中执行并行交换操作的方式非常相似(事实上,支持SIMD的编译器应该能够优化以下代码,使其更快):


一般来说,将一个数字与其自身进行Xoring应该会为您提供值0,这样您就可以轻松地将变量设置为0

0100101^0100101=0


这是异或运算的卡诺映射的结果,当两个位都是1或都是0时,提供0。

一般建议:不要将有符号整数移位到全宽。If可以是实现定义的,甚至可以调用未定义的行为(有关详细信息,请参阅标准)。如果你需要32位整数,使用标准的固定宽度类型。我对你的要求有点困惑,因为我在你的程序中没有看到任何异或,除了你在程序上面展示的不相关的片段。猜测一下,可能您正在尝试执行类似
a=(a>4)
的操作,这是由于序列点而未定义的行为。
for(i=1;i@paddy)我没有
a=(a>4)中的序列点问题
?请详细说明。嗯,我想我可能真的被搞糊涂了,完全错了。哦,太好了,这是我想做的事情,谢谢你的帮助!
a=((a>>16)^a);校验和=((a>>8)^a)&0xFF;
需要更少的移位这是一个很好的观点@LưuVĩnhPhúc--我相应地重新表述了答案。
uint32_t checksum = ( (a >> 24) ^ (a >> 16) ^ (a >> 8) ^ a ) & 0xff;
uint32_t checksum = (a >> 16) ^ a;
checksum = ((checksum >> 8) ^ checksum) & 0xff;
uint32_t simple_checksum( uint32_t *v, size_t count )
{
    uint32_t checksum = 0;
    uint32_t *end = v + count;
    for( ; v != end; v++ )
    {
        checksum ^= *v;            /* accumulate XOR of each 32-bit value     */
    }
    checksum ^= (checksum >> 16);  /* XOR high and low words into low word    */
    checksum ^= (checksum >> 8 );  /* XOR each byte of low word into low byte */
    return checksum & 0xff;        /* everything from bits 8-31 is rubbish    */
}