【问题标题】:Why is there no XAND operator?为什么没有 XAND 运算符?
【发布时间】:2014-03-02 09:58:42
【问题描述】:

我想知道为什么没有 XAND 运算符? Wikipedia 当然没有提到一个。我在this question 上找到了一些 cmets 来回答,但似乎存在广泛的分歧。我会认为 XAND 总是会导致错误,除了错误的 XAND 错误,但再想想这可能是错误的。

【问题讨论】:

  • 因为没有人找到它可以表达的有用概念?
  • that 你的 XAND 吗?
  • 看不到一点不代表别人不会用。我可以很容易地说出 XOR 的意义是什么,因为它可以由 AND、OR、NOT 组成
  • 等等,你想要一个表示 0*0=1 的运算符吗?我们已经为那个操作符起了一个名字,叫做 NOR。

标签: assembly language-agnostic operators logic


【解决方案1】:

Wikipedia 提到了NOR,它的真值表与您所说的 XAND 完全相同,而且名称可能更直观。 XOR 中的“独占”意味着我们排除了两个输入都是true 的情况。 “独占与”一词没有多大意义,因为 AND 仅适用于一种输入组合的 true,那么您会排除什么?

【讨论】:

  • 我不认为它被称为排他性是因为我们排除了某些东西,而是在 xor 中,其中一个术语可能是正确的,而不是两者都正确。
  • @Leeor 好的,但是“仅其中一个术语为真”基本上是指“如果一个术语为真,我们排除另一个为真的情况”,这相当于排除了两者的情况是真的。在我看来,不同的表述,相同的含义。
  • 我一直认为排他性是这样的:OR 表示两者都为真包括的情况,XOR 表示两者之一析取为真排除它们都为真的情况。”
【解决方案2】:

我们之所以存在当前的二进制操作,是因为大量的软件和硬件设计人员发现它们很有用。它们在有名字之前就被明确定义了:有人做了一个 AND,因为他们需要一个二元运算,使得“A(运算)B”只有当 A 和 B 都为 1 时才会为 1,并且他们将此运算命名为“AND”。

您的问题让我印象深刻的是,您没有为 XAND 提出理由,也没有明确定义它。本质上,您是在问两个问题:

  • 是否存在称为 XAND 的明确定义的二元运算?
  • 假设确实存在定义明确的 XAND,它的真值表是什么?

6502、PowerPC、MIPS、AVR32 或 x86/amd64 指令集都没有“xand”,但它们都有 AND、OR、XOR 和 NOT 原子操作。我所知道的具有二进制操作的语言都没有原子(如语义上不可分割的)XAND 操作。因此,第二个问题无法回答。对于 XAND 应该是什么没有达成共识,因为没有人费心去定义它并且让其他人使用它。

幸运的是,用我们已有的四个二元运算来表示几乎任何二元运算都相当容易。正如您正确指出的那样,我们甚至可以至少摆脱 XOR;但我们不这样做,因为很多人发现它作为原子操作很有用。

【讨论】:

    【解决方案3】:

    好吧,让我们看看。在 OR 中,我们有 3 种情况,结果为 1。在 XOR 中,我们排除其中一种 -

    1. 0 xor 0 = 0
    2. 0 xor 1 = 1
    3. 1 xor 0 = 1
    4. 1 xor 1 = 0 - 排除的情况。

    在 AND 中,我们有 3 种结果为 0 的情况。在 XAND 中,我们排除其中一种

    1. 0 xand 0 = 1 - 排除的情况
    2. 0 x 和 1 = 0
    3. 1 xand 0 = 0
    4. 1 x 和 1 = 1

    如您所见,这实际上是 XOR+NOT(也称为 XNOR)操作。

    这些运算的代数符号是:

    或:A + B

    与:A.B

    异或:A⊕B(U+2295 加号)

    XAND: A⊙B (U+2299 圆点)

    【讨论】:

    • 你会说0 and 0 = 0 被“包含”并且是常规的 AND 吗?将0 xand 0 = 1 视为“排除”的情况似乎是对术语的滥用。
    • 你会说 1 或 1 = 1 被“包含”在常规 OR 中吗?所有“排他”操作对两个输入参数相等的情况都有特殊的态度。
    • 嗯,是的,我认为“包含/排除”暗示“来自产生真实的输入集”,但也许这只是我......
    • 考虑到只有一个被广泛认可的独占操作,推断关于 所有这些 的属性对我来说似乎有些牵强。 OP 也不会像你那样定义 XAND。
    • 如果您没有发明定义,您能否引用定义 XAND 的来源?
    【解决方案4】:

    常规名称是XNOR,它可以在TTL和CMOS芯片中找到。维基文章

    wiki xnor

    二进制操作的替代名称用于旧计算机,如 CDC 3000 系列、Univac 1100 系列……。使用 RSLT 表示结果操作数,使用 OPR1 和 OPR2 表示操作数:

    选择性设置 => RSLT = OPR1 OR OPR2

    选择性补码 => RSLT = OPR1 XOR OPR2

    选择性复制 => RSLT = OPR1 AND OPR2

    选择性清除 => RSLT = (NOT OPR1) AND OPR2

    选择性替代?? RSLT = ((NOT OPR1) AND RSLT) OR (OPR1 AND OPR2)

    【讨论】:

      猜你喜欢
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 2018-09-23
      • 2010-10-24
      • 2011-09-14
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多