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

这与我们对原始表达式所做的操作是一样的。

你是在问简化是如何进行的吗?你可能需要复习布尔代数的一些规则。很难直观地看到,但真值表应该能让你相信它是正确的。是的,我想简化它。