如何在C中使用mod 2加法来制作XOR?

如何在C中使用mod 2加法来制作XOR?,c,bit-manipulation,bitwise-operators,bitwise-xor,C,Bit Manipulation,Bitwise Operators,Bitwise Xor,我读到XOR相当于mod 2加法。不过,我的假设是,这是位级别的。也就是说,5XOR 10不等于5+10mod 2,因为这将是不正确的1。因此,我编写了以下函数: unsigned char XOR_BIT(unsigned char A, unsigned char B) { unsigned char x; unsigned char y; unsigned char c; unsigned char o; unsigned char output =

我读到XOR相当于mod 2加法。不过,我的假设是,这是位级别的。也就是说,5XOR 10不等于5+10mod 2,因为这将是不正确的1。因此,我编写了以下函数:

unsigned char XOR_BIT(unsigned char A, unsigned char B)
{
    unsigned char x;
    unsigned char y;
    unsigned char c;
    unsigned char o;
    unsigned char output = 0;
    for(c = 0; c < 8; c++)
    {
        printf("=========Round %u=============\n", c);
        x = (A & (1 << c));
        printf("x: %u\n", x);
        y = (B & (1 << c));
        printf("y: %u\n", y);
        o = (x + y) % 2;
        printf("o: %u\n", o);
        output |= (o << c);
        printf("output: %u\n", output);
    }
    return output;
}
我怀疑是我误解了所需的逐位操作,或者是我有一个代码错误,但我在这个领域没有必要的知识来确定问题

此功能的预期行为是:

每次获取每个字节1位 对每对位执行mod 2加法 将每个结果位存储在输出中 将输出位返回为1字节
在执行模x和模y之前,您要添加移位值。模x和模y在模之前应为0或1。您应该使用

x = (A >> c) & 1;
y = (B >> c) & 1;

然后添加它们,进行模运算,并将位存储到输出中,就像您已经在做的那样。

在进行模运算之前添加移位值x和y,在模运算之前应该是0或1。您应该使用

x = (A >> c) & 1;
y = (B >> c) & 1;
然后添加它们,进行模运算,并像之前一样将位存储到输出中

我读到XOR相当于mod 2加法。但我的假设是 这是位级别的。也就是说,5或10不等于5 +10模2,因为这将是5,这是不正确的

5+10 mod 2是1,不是5,但这与按位异或的结果也不同。您或多或少正确地推断出断言适用于各个位,但您的代码表明您可能尚未完全理解这一点

按位异或完全等价于2阶循环群中的mod 2加法,其中mod 2加法是普通加法算子。该组只有两个元素,通常标记为0和1。模2加法并不自然地定义在与之不同构的群上,尽管它可以用一种简单的方式扩展。巧合的是,按位AND相当于该组元素的乘法

认为模2的加法结果总是0或1,这取决于加法是否具有相同或不同的奇偶性,并考虑表达式1。 我读到XOR相当于mod 2加法。但我的假设是 这是位级别的。也就是说,5或10不等于5 +10模2,因为这将是5,这是不正确的

5+10 mod 2是1,不是5,但这与按位异或的结果也不同。您或多或少正确地推断出断言适用于各个位,但您的代码表明您可能尚未完全理解这一点

按位异或完全等价于2阶循环群中的mod 2加法,其中mod 2加法是普通加法算子。该组只有两个元素,通常标记为0和1。模2加法并不自然地定义在与之不同构的群上,尽管它可以用一种简单的方式扩展。巧合的是,按位AND相当于该组元素的乘法


认为模2的加法结果总是0或1,这取决于加法是否具有相同或不同的奇偶性,并且认为表达式1这个答案是非常有洞察力的。我很难理解1个部分:考虑到表达式1 @ Tyn Endiad,我的意思是奇偶校验在传统意义上的偶数等于奇数。这是最低有效位的函数,或者更一般地说,在任何偶数基表示中,它是单位数字的函数。哦,我现在明白了,因为最低有效位总是决定奇数或偶数,因为我们总是与0进行与零的运算,除非c=0,否则我们总是与0进行与零的运算,因此总是清除位,总是使数字相等。谢谢问题-2阶循环群是一个有限域吗?@从技术上讲,不,2阶循环群是一个群,这意味着,除其他外,它只有一个运算,而一个域有两个运算。但是有一个2阶的有限域,2阶的有限群嵌入在这个域中,这个答案很有洞察力。我很难理解1个部分:考虑到表达式1 @ Tyn Endiad,我的意思是奇偶校验在传统意义上的偶数等于奇数。这是最低有效位的函数,或者更一般地说,在任何偶数基表示中,它是单位数字的函数。哦,我现在明白了,因为最低有效位总是决定奇数或偶数,因为我们总是与0进行与零的运算,除非c=0,否则我们总是与0进行与零的运算,因此总是清除位,总是使数字相等。谢谢问题-二阶循环群是一个有限域吗?@从技术上讲,二阶循环群不是


一个组,意味着除其他外,它只有一个操作,而一个字段有两个操作。但是有一个2阶的有限域,2阶的有限群嵌入在这个域中。关于:5+10模2,模2只有两个可能的结果,它们是0和1。对于整个语句,结果是1。“mod”的定义:Modulo '%’通常被称为模算符,是所有C语言、C++语言、Python语言等的算术运算符,当两个数被分开时,它找到余数。示例-10%4给出2,因为10除以4时的余数是2。C中的“异或”运算通过^运算符实现。即A=B^C;关于:5+10模2,模2只有两种可能的结果,即0和1。对于整个语句,结果是1。“mod”的定义:Modulo '%’通常被称为模算符,是所有C语言、C++语言、Python语言等的算术运算符,当两个数被分开时,它找到余数。示例-10%4给出2,因为10除以4时的余数是2。C中的“异或”运算通过^运算符实现。即A=B^C;
    x = !(A & (1 << c));
    y = !(B & (1 << c));
    o = (x + y) % 2;
    output |= (o << c);