web-dev-qa-db-ja.com

「nor」のキーワードまたは演算子はありますか?

nor に相当する演算子はありますか?たとえば、私の好きな色は緑でも青でもありません。

そして、コードは以下と同等です:

// example one
if (color!="green" && color!="blue") { 

}

// example two
if (x nor y) {
    // x is false and y is false
}
56
1.21 gigawatts

主流の言語には専用のNORおよびNAND演算子はありませんが、一部のあまり知られていない言語(たとえば、「ゴルフ」言語))にはあります。 [〜#〜]などapl [〜#〜]および NORおよびNANDのそれぞれ。

別のクラスの例は、 [〜#〜] vhdl [〜#〜]Verilog などのハードウェア設計言語にあります。NANDおよびNORゲートは、通常、AND/OR/NOTゲートから作成された等価回路よりも安価(トランジスタ数が少ない)であるため、ハードウェア設計に非常に役立ちます。これは、ハードウェア設計言語がゲートを含める傾向がある理由の1つです。別のゲート理由は、それらが特定のビット操作トリックに役立つ可能性があるためです。

71
nomadictype

いいえ、高水準のメインストリームプログラミング言語にはnor演算子はありません。

どうして ?

主に読みにくいため:

  • いくつかの演算子( "and not"の精神的な組み合わせ、またはより文学的なスタイルが必要です: "さらに否定的な "、"each untrue "
  • 最初のオペランドの暗黙のnotを意味しますが、読者はこれを後で理解するだけです
  • これは、「nor xもy」、「nor xもyなど、最初のオペランドに明示的な否定を使用する人間の言語とは異なります "。したがって、読者は混乱するかもしれません(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

Untilループの使用

一部の言語では、whileまたはuntilを使用して条件を表現できるループ命令も提供しており、より「ポジティブ」な方法を選択できます。これらの手順は、たとえばuntil c do ... in Rubydo 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
    ...  

否定がすべての引数に適用されることを読者がすぐに理解するので、演算子よりも関数の読みやすさの利点があります。一部の言語では、引数の数が可変の関数を定義できます。

45
Christophe

質問に対する@KilianFothのコメントが適切です。

nornotからorを合成できます。

if (x nor y)

とまったく同じです

if (not (x or y))

別の演算子としてnorを導入すると、言語に冗長性が導入されますが、これは不要でも不要でもあります(または-不要で不要でもあります)。

同様に、nand演算子を使用している言語については知りません。これは、not演算子とand演算子から合成できるためと考えられます。

理論的には、nand演算子のみまたはnor演算子のみを使用して言語を作成できます。 andor、およびnotはすべて、それらから合成することができます。唯一の問題は、これが途方もなく扱いにくいことです。例については、Wikipediaの NOR logic および NAND logic を参照してください。

18
Mael

はい、 [〜#〜] 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
∇

オンラインでお試しください!

11
Adám

この答えは、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は同等です)。

10
Walter Mitty

Perlには、条件文を反転できるunlessキーワードがあります。

unless ($color eq 'green' or $color eq 'blue') {
    # code
}

NOR演算子ではありませんが、同様の方法で意図を表現できます。

3
Rory Hunter

あなたが説明したように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) {