是否有一个等于nor的运算符?例如,我最喜欢的颜色既不是绿色也不是蓝色。
该代码将等效于:
// example one
if (color!="green" && color!="blue") {
}
// example two
if (x nor y) {
// x is false and y is false
}
color not in ['green', 'blue']
是否有一个等于nor的运算符?例如,我最喜欢的颜色既不是绿色也不是蓝色。
该代码将等效于:
// example one
if (color!="green" && color!="blue") {
}
// example two
if (x nor y) {
// x is false and y is false
}
color not in ['green', 'blue']
Answers:
尽管主流语言没有专用的NOR和NAND运算符,但一些鲜为人知的语言(例如,某些“打高尔夫球”语言)可以。例如,APL具有⍱
和⍲
用于NOR和NAND,分别。
可以在诸如VHDL,Verilog等硬件设计语言中找到另一类示例。NAND和NOR门在硬件设计中非常有用,因为通常比用AND / OR / NOT制成的等效电路便宜(需要更少的晶体管)。门,这是硬件设计语言倾向于包含它们的原因之一;另一个原因是,它们对于某些位摆弄的技巧很有用。
不,nor
任何高级主流编程语言都没有运算符。
主要是因为很难阅读:
not
在第一个操作数上隐含了一个隐含含义,但读者之后才明白这一点。(x nor y)
与(x and not y)
而不是((not x) and (not y))
or
对不适用的表面语义感到困惑nor
是基本的硬件门,可用于制造所有其他逻辑门。因此,我们可以说所有其他逻辑运算符都是组合,并且nor
是最简单的基本逻辑运算符。
但是,硬件的真实情况不一定适用于人类。尽管它在硬件级别上很受欢迎,但一些主流CPU甚至NOR
在其汇编程序指令集(例如x86)中都没有提供。
可读性很重要。有时可以通过其他方式进行改进。
例如:
if x not in [1,2] // use of 'in' or 'not in' operator instead of x!=1 and x!=2
if x==1 or x==2
action A
else
action B
代替
if x!=1 and x!=2
action B
else
action A
某些语言还提供循环指令,允许使用while
或来表达条件until
,让您选择更“积极”的方式。这些指令是例如 until c do ...
在红宝石,do until c ...
在VB,或repeat ... until c
在帕及其后代。
例如:
Until (x==1 or x==2) do
...
等效于:
While (x!=1 and x!=2)
...
现在,如果您仍然喜欢nor
语法,则可以定义一个函数,但前提是您不希望出现快捷方式:
If ( nor(x,y) ) // attention, x and y will always be evaluated
...
与操作符相比,该函数具有可读性方面的优势,因为读者可以立即理解,该否定适用于所有参数。在某些语言中,您可以定义具有可变数量的参数的函数。
while (not (x == 1 or x == 2))
我发现该x != 1 and x != 2
版本难以阅读,并且发现“ x既不是1,也不是2”比“ x不是1且x不是2”要容易得多。
Repeat
... Until
总是至少执行一次循环体。如果x为1,则循环主体仍将执行,但不会重复。While
在这种情况下,循环将不会执行主体。
nor(x,y)
是否始终评估x和y in 取决于语言和nor()
实现方式。在某些语言(D,Io等)中,被调用函数可以决定是否以及何时评估参数。
@KilianFoth对这个问题的评论是当场的。
您可以nor
从not
和进行合成or
:
if (x nor y)
与...完全相同
if (not (x or y))
引入nor
作为一个独立的运营商将引入冗余的语言,这是既不需要,也不希望(或-它不需要和不想要的)。
同样,我不知道任何语言都有nand
运算符-可能是因为它可以由not
and and
运算符合成。
从理论上讲,您可以创建仅包含nand
或仅包含nor
运算符的语言。所有的and
,or
以及not
然后可以通过从他们synthesied。唯一的问题是,这将非常荒谬。有关示例,请参见Wikipedia上的NOR逻辑和NAND逻辑。
nor
不包括在内。否则,语言为何具有and
和or
?多亏了德摩根,他们是多余的。事实上,你可以代替所有三个常规逻辑运算符(and
,or
,not
通过提供)只是 nor
,当你正确地指出。
and
,or
和not
- 来考虑逻辑,因为这是大多数人类语言所使用的。一旦您匹配了and / or / not的心理模型,nor&nand就变得多余了。它们的冗余甚至以其名称编码:“ n(ot)和”和“ n(ot)或”。如果我们有针对他们的独特,预先存在的英语术语,而不仅仅是综合术语,那么您可能会更经常地看到它们。
not
,and
,or
。例如,某些BASIC方言(GW-BASIC,QuickBASIC等)具有“异或”,“含意” IMP(→NOT(x XOR y))和等价EQV(→NOT(x)OR y)作为附加运算符。
这个答案来自1960年代中期生产的计算机的汇编语言。这很模糊,但是在某些方面它解决了您的问题。
DEC(数字设备公司)在1960年代中期推出了PDP-6计算机。该机器总共有64条指令,它们是对两个操作数的布尔运算(包括一些退化的情况)。这64条指令实际上是16个运算符,每个运算符有4个变体。
其中两个运算符ANDCB和ORCB分别实现了NOR和NAND(除非我对双负逻辑感到困惑)。您可以看到 操作码表。该操作码表实际上是PDP-10计算机的后继产品,它是PDP-6的后继产品。
如果您以二进制形式看数字指令,它将变得更加有趣。事实证明,对于范围为400-477(八进制)的所有操作码,指令本身的四位为16个可能的布尔运算符提供了四位真值表。其中一些运算符会忽略其中一个或两个输入。例如,SETZ和SETO忽略两个输入。
PDP-6的设计者利用这一事实来实现所有这些指令,而逻辑所需要的逻辑要少于仅实现其中一些指令所需要的逻辑。其中一些指令很少(如果有的话)出现在汇编语言代码中。但是他们都在那里。
因此ANDCB相当于NOR。(再次,除非我的逻辑倒退,在这种情况下,ORCB是等效的)。
or
和!
,并且因为很少使用双底片-多数人发现它们特别难以阅读。