C 如何相互转换xor、and、not运算符
我正在读一篇关于加密哈希函数的论文。它显示了一个我很难理解的公式转换C 如何相互转换xor、and、not运算符,c,xor,C,Xor,我正在读一篇关于加密哈希函数的论文。它显示了一个我很难理解的公式转换 Ch(x,y,z) = (x & y) ^ (~x & z) 在上面,&是按位的,^是按位异或,~不是按位的。可以简化如下: Ch(x,y,z) = ((y^z)&x)^z 我不知道它是如何计算的。从以下几点开始反向计算: ((y ^ z) & x) ^ z 分发“&x”: 删除多余的括号: (y & x) ^ (z & x) ^ z (x & y) ^ ((x
Ch(x,y,z) = (x & y) ^ (~x & z)
在上面,&
是按位的,^
是按位异或,~
不是按位的。可以简化如下:
Ch(x,y,z) = ((y^z)&x)^z
我不知道它是如何计算的。从以下几点开始反向计算:
((y ^ z) & x) ^ z
分发“&x”:
删除多余的括号:
(y & x) ^ (z & x) ^ z
(x & y) ^ ((x & z) ^ z)
(x & y) ^ ((~(x & z) & z) | (x & z & ~z))
(x & y) ^ (~(x & z) & z)
转换操作数:
(x & y) ^ (x & z) ^ z
添加括号:
(y & x) ^ (z & x) ^ z
(x & y) ^ ((x & z) ^ z)
(x & y) ^ ((~(x & z) & z) | (x & z & ~z))
(x & y) ^ (~(x & z) & z)
将“A^B=(~A&B)|(A&B)”应用于右侧:
(x & y) ^ ((~(x & z) & z) | ((x & z) & ~z))
删除多余的括号:
(y & x) ^ (z & x) ^ z
(x & y) ^ ((x & z) ^ z)
(x & y) ^ ((~(x & z) & z) | (x & z & ~z))
(x & y) ^ (~(x & z) & z)
应用“A&~A=0”:
应用“A&0=0”:
应用“A | 0=A”:
删除多余的括号:
(y & x) ^ (z & x) ^ z
(x & y) ^ ((x & z) ^ z)
(x & y) ^ ((~(x & z) & z) | (x & z & ~z))
(x & y) ^ (~(x & z) & z)
应用德摩根定律“~(A&B)=(~A| ~B)”:
分发“&z”:
应用“A&~A=0”:
应用“A | 0=A”:
因此,(x&y)^(~x&z)
相当于((y^z)&x)^z
真值表应该让你相信它是正确的
尝试用ASCII艺术绘制真值表非常单调乏味,因此对于以下内容
z=0 x z=1 x
| 0 1 | 0 1
--+------- --+------- === a b e f
y 0 | a b y 0 | e f c d g h
1 | c d 1 | g h
所以
因此:
(x&y) ^ (~x&z) = 0 0 1 0
0 1 1 1
现在,我们正在部分解决方案:
y ^ z = 0 0 1 1
1 1 0 0
(y^z) & x = 0 0 0 1
0 1 0 0
((y^z)&x) ^ z = 0 0 1 0
0 1 1 1
这与我们对原始表达式所做的操作是一样的。你是在问简化是如何进行的吗?你可能需要复习布尔代数的一些规则。很难直观地看到,但真值表应该能让你相信它是正确的。是的,我想简化它。