nor に相当する演算子はありますか?たとえば、私の好きな色は緑でも青でもありません。
そして、コードは以下と同等です:
// example one
if (color!="green" && color!="blue") {
}
// example two
if (x nor y) {
// x is false and y is false
}
主流の言語には専用のNORおよびNAND演算子はありませんが、一部のあまり知られていない言語(たとえば、「ゴルフ」言語))にはあります。 [〜#〜]などapl [〜#〜] は⍱
および⍲
NORおよびNANDのそれぞれ。
別のクラスの例は、 [〜#〜] vhdl [〜#〜] 、 Verilog などのハードウェア設計言語にあります。NANDおよびNORゲートは、通常、AND/OR/NOTゲートから作成された等価回路よりも安価(トランジスタ数が少ない)であるため、ハードウェア設計に非常に役立ちます。これは、ハードウェア設計言語がゲートを含める傾向がある理由の1つです。別のゲート理由は、それらが特定のビット操作トリックに役立つ可能性があるためです。
いいえ、高水準のメインストリームプログラミング言語には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 ...
in Ruby 、do until c ...
in vb 、またはrepeat ... until c
in Pascal およびその子孫。
例えば:
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
...
否定がすべての引数に適用されることを読者がすぐに理解するので、演算子よりも関数の読みやすさの利点があります。一部の言語では、引数の数が可変の関数を定義できます。
質問に対する@KilianFothのコメントが適切です。
nor
とnot
からor
を合成できます。
if (x nor y)
とまったく同じです
if (not (x or y))
別の演算子としてnor
を導入すると、言語に冗長性が導入されますが、これは不要でも不要でもあります(または-不要で不要でもあります)。
同様に、nand
演算子を使用している言語については知りません。これは、not
演算子とand
演算子から合成できるためと考えられます。
理論的には、nand
演算子のみまたはnor
演算子のみを使用して言語を作成できます。 and
、or
、およびnot
はすべて、それらから合成することができます。唯一の問題は、これが途方もなく扱いにくいことです。例については、Wikipediaの NOR logic および NAND logic を参照してください。
はい、 [〜#〜] apl [〜#〜] とその方言の一部はnor(andnand)。 APLでは、norは⍱
と示されます(∨
はorであり、~
であるためisnot):
∇ result←ExampleOne color
:If (color≡'green')⍱(color≡'blue')
result←'warm'
:Else
result←'cold'
:EndIf
∇
∇ result←ExampleTwo(x y)
:If x⍱y
result←'x is false and y is false'
:Else
result←'at least one of them is true'
:EndIf
∇
この答えは、1960年代半ばに製造されたコンピューターのアセンブラー言語からのものです。それはかなりあいまいですが、いくつかの点でそれはあなたの質問に対処します。
DEC(Digital Equipment Corporation)は、1960年代半ばにPDP-6コンピューターを発売しました。このマシンには、2つのオペランド(一部の縮退ケースを含む)に対するブール演算である合計64の命令がありました。これらの64の命令は実際には16のオペレーターであり、各オペレーターには4つのバリアントがあります。
演算子の2つであるANDCBとORCBはそれぞれNORとNANDを実装しています(二重の負論理で混同しない限り)。 opcode table を確認できます。 opcodeテーブルは、実際にはPDP-6の後継であるPDP-10コンピュータ用です。
数値命令を2進数で見ると、より興味深いものになります。 400〜477(8進数)の範囲のすべてのオペコードについて、命令自体の4ビットが、16のブール演算子の4ビット真理値表を提供することがわかります。これらの演算子の一部は、入力の一方または両方を無視します。たとえば、SETZとSETOは両方の入力を無視します。
PDP-6の設計者は、この事実を利用して、これらの命令すべてを実装するのに必要なロジックよりも少ないロジックでこれらすべての命令を実装しました。これらの命令の一部は、たとえあったとしても、アセンブリ言語コードではめったに現れませんでした。しかし、それらはすべてそこにありました。
したがって、ANDCBはNORに相当します。 (ここでも、論理を逆にしない限り、ORCBは同等です)。
Perlには、条件文を反転できるunless
キーワードがあります。
unless ($color eq 'green' or $color eq 'blue') {
# code
}
NOR演算子ではありませんが、同様の方法で意図を表現できます。
あなたが説明したようにnor
演算子は再現できません。これは多くのバグを見つけるのが難しいことにつながります。
あなたの「例2」は本質的にこれです:
if (false nor false) {
becomes
if (true) {
しかし、3つの変数を使用してもう一度試して、何が起こるかを確認してください。
if (false nor false nor false) {
becomes
if ((false nor false) nor false) {
becomes
if (true nor false) {
becomes
if (false) {