按位运算符:仅使用 & 和 ~ 来获取 ^

Bitwise Operators: Using only & and ~ to get ^

提问人:cinos 提问时间:3/5/2020 最后编辑:Simsoncinos 更新时间:1/30/2023 访问量:1145

问:

几天来,我一直被教授给的奖金困住了:

  • 仅使用 ~ 和 & 给出 x^y
  • 假设机器使用二进制补码,即整数的 32 位表示形式。

我尝试了许多不同的组合,也尝试写出运算符^的逻辑,但一直没有成功。任何提示或帮助将不胜感激!

C 按位运算符 代数

评论

7赞 Ed Heal 3/5/2020
德摩根定律可能会有所帮助
5赞 Barmar 3/5/2020
XOR 是 AND 和 NOT 运算符的组合吗?
0赞 cinos 3/5/2020
@EdHeal我之前在另一个问题上看到了这个,但我找不到 XOR 证明,我会再看一遍,谢谢!
0赞 Jerry Jeremiah 3/5/2020
en.wikipedia.org/wiki/XOR_gate#/media/File:XOR_from_NAND.svg
0赞 curiousguy 3/5/2020
在这种情况下,我未能掌握 2-compl 的相关性。

答:

3赞 Aiyion.Prime 3/5/2020 #1

XOR 运算符实际上可以写成这两者的组合。我将分两步进行:

A NAND B = NOT(A 和 B)

A 异或 B = (A NAND (A NAND B)) NAND (B NAND (A NAND B))

如前所述,在数学上:

https://math.stackexchange.com/questions/38473/is-xor-a-combination-of-and-and-not-operators

评论

0赞 Jerry Jeremiah 3/5/2020
这是很多操作!
1赞 Aiyion.Prime 3/5/2020
我很乐意在几天后,当他过了提交日期时,他会把它打下来。
1赞 chepner 3/5/2020
@JerryJeremiah 仅就NAND而言实现这一点的原因是,拥有大量一种门比拥有少量不同种类的门更便宜(在硬件上)。你不会用NAND来重写XOR,因为你正在尝试优化软件实现。
0赞 Jerry Jeremiah 3/5/2020
@chepner当然,但维基百科有一个四NAND门版本。我确实同意五门版本更习惯地实现了 xor 的“定义”,但它仍然有更多的门......
2赞 templatetypedef 3/5/2020 #2

首先,假设您有可用的每个 、 和 运算符。你能以这种方式实现吗?&|~^

接下来,看看你是否能找到一种纯粹用 和 来表达的方法。|&~

最后,将这些想法结合在一起。

祝你好运!

评论

1赞 cinos 3/5/2020
有人已经发布了答案,但我喜欢你的风格,因为它让我通过自己校对来理解。我要试试这个,然后看看我是否能自己得到答案。谢谢!
3赞 chux - Reinstate Monica 3/5/2020
OP要求“任何提示或帮助将不胜感激!”,这篇文章回答了这个问题。
2赞 Simson 3/5/2020 #3

您可以尝试绘制 XOR、ANDOR 的真值表

a b  a^b
0 0   0
0 1   1
1 0   1
1 1   0

a b  a|b
0 0   0
0 1   1
1 0   1
1 1   1

a b  a&b
0 0   0
0 1   0
1 0   0
1 1   1

接下来,了解如何使用和构建它|&

a|b将前三行全部正确,另一行。如果我们否定它,它可以用来掩盖想要的线!因此,我们可以将 xor 表述为:a&b

(a b)但当(a b)时不行

在布尔代数中没有 but,所以它变成了一个 这导致了这个:

(a|b)&~(a&b)

编辑:指出我答错了问题,用德摩根定律来建立或

~(~a & ~b)

给出的答案是

~(~a&~b)&~(a&b)

评论

0赞 Simson 3/5/2020
阅读问题;-)