我读到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
)。这应该能告诉你为什么你的程序不能像你期望的那样工作。
为了执行计算,需要将x
和y
映射到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/