【问题标题】:Bitmask to flip bits ... without XOR?位掩码翻转位......没有异或?
【发布时间】:2011-05-29 09:57:42
【问题描述】:

非常简单,真的。我想否定以 2 的补码表示的整数,为此,我需要首先翻转字节中的所有位。我知道使用 XOR 很简单——只需使用带有位掩码 11111111 的 XOR。但是没有 XOR 怎么办? (即只是 AND 和 OR)。哦,在我使用的这种蹩脚的汇编语言中,NOT 不存在。所以那里也没有骰子。

【问题讨论】:

  • 即使是“蹩脚的汇编语言”也应该有一些不做的方式。也许它被称为别的东西?
  • 如果您列出了所有在这种“糟糕的汇编语言”中实际可用的操作,这可能会有所帮助。事实证明,仅使用 AND 和 OR 是不可能完成您想做的事情的。
  • 是的,我很笨。我所要做的就是从 0 中减去整数......它会否定它。很明显。

标签: xor bitmask


【解决方案1】:

你不能用 AND 和 OR 门构建一个 NOT 门。

正如我被要求解释的那样,这里的格式很好。假设您有任意数量的ANDOR 门。您的输入是A、0 和 1。您有六种可能性,因为您可以从三个信号中制作三对(选择一个被遗漏的信号)和两个门。现在:

Operation  Result
A AND A    A
A AND 1    A
A AND 0    0
A OR A     A
A OR 1     1
A OR 0     A

因此,在您将任何信号输入第一个门之后,您的新信号集仍然只是 A、0 和 1。因此,这些门和信号的任何组合只会得到 A、0 和 1。如果您的最终输出是 A,那么这意味着对于 A 的两个值它不会等于 !A,如果你的最终输出是 0,那么 A = 0 是这样一个值,你的最终值不是 !A 与 1 相同。

编辑:单调的评论也是正确的!让我在这里重复一遍:如果您将 AND / OR 的任何输入从 0 更改为 1,则输出不会减少。因此,如果您声称要构建一个 NOT 门,那么我会将您的输入从 0 更改为 1 ,您的输出也不能减少,但它应该 - 这是一个矛盾。

【讨论】:

  • 你能解释一下原因吗?
  • 为什么?好吧,假设您有 A、0、1 AND、OR... 现在将它们组合起来您会立即看到。 A AND A 是 A,A AND 0 是 0,A AND 1 是 A,A OR A 是 A,A OR 1 是 1,A OR 0 是 A。您想组合这些信号和门并得到 A,但作为你可以看到第一步之后你仍然只有A、0、1个信号,而且不可能突破这个圈子。
  • 因为AND和OR是单调函数,单调函数的组合是单调函数,NOT不是单调函数。 (“单调函数”是指当您增加其中一个输入时,输出保持不变或增加。)
  • @Asker 是对的。 NOT 函数是布尔逻辑 en.wikipedia.org/wiki/Boolean_algebra_(logic)#Basic_operations> 的基本运算。这些操作是公理化定义的,这意味着你只需要相信它
  • NOT 是由其输入和输出定义的函数,您可以仔细检查输入和输出。没什么好相信的。
【解决方案2】:

(foo & ~bar) | (~foo & bar) 能解决问题吗?

编辑:哦,NOT 不存在。没看到那部分!

【讨论】:

  • 不幸的是我也没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
  • 1970-01-01
  • 2021-07-15
相关资源
最近更新 更多