我读到XOR相当于mod 2加法不过,我的假设是,这是在比特级。意思是,5 XOR 10不等于(5+10)mod 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;
}

但是,这会产生以下结果:
=========Round 0=============
x: 1
y: 0
o: 1
output: 1
=========Round 1=============
x: 0
y: 2
o: 0
output: 1
=========Round 2=============
x: 4
y: 0
o: 0
output: 1
=========Round 3=============
x: 0
y: 8
o: 0
output: 1
=========Round 4=============
x: 0
y: 0
o: 0
output: 1
=========Round 5=============
x: 0
y: 0
o: 0
output: 1
=========Round 6=============
x: 0
y: 0
o: 0
output: 1
=========Round 7=============
x: 0
y: 0
o: 0
output: 1
MyXOR: 1
Standard XOR: 15

我怀疑是我误解了所需的按位操作,或者是我有一个代码错误,但我不太了解此域中确定问题的必要知识。
此函数的预期行为是:
一次获取每个字节1位
对每对位执行mod 2加法
将每个结果位存储在输出中
将输出位返回为1字节

最佳答案

我读到XOR相当于mod 2加法但我的假设
这是位级别的。意思是,5 XOR 10不等于(5
+10)模式2,因为这将是5,这是不正确的。
(5+10)mod 2是1,而不是5,但这也不是按位异或的结果。您已经或多或少地正确地推断出断言适用于各个位,但是您的代码表明您可能还没有完全理解这一点。
位异或完全等价于2阶循环群中的mod 2加法,其中mod2加法是普通加法算子这个组只有两个元素,通常标记为0和1模2加法并不是自然定义在非同态群上的,尽管它可以用一种简单的方式来扩展。巧合的是,按位与等于在这个组的元素上乘法。
考虑模2加法的结果总是0或1,这取决于加法器分别具有相同或不同的奇偶校验,并且考虑表达式1 << c在且仅当c为0时具有奇偶校验因此,只有当A & (1 << c)为零时,c形式的表达式才能具有奇数奇偶校验(但实际奇偶校验也取决于A)。这应该能告诉你为什么你的程序不能像你期望的那样工作。
为了执行计算,需要将xy映射到0和1。有几种方法可以做到这一点。最明显的方法是执行按位移位,例如已经描述的另一个答案。出于您的特殊目的,您还可以使用双重逻辑否定,这在某些方面甚至更自然由于问题的对称性,你甚至可以把它简化为一个否定:

    x = !(A & (1 << c));
    y = !(B & (1 << c));
    o = (x + y) % 2;
    output |= (o << c);

关于c - 如何在C语言中使用mod 2加法制作XOR?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58551891/

10-13 05:25