“nor”에 대한 키워드 또는 연산자가 있습니까?


56

nor 와 동등한 연산자가 있습니까? 예를 들어, 내가 가장 좋아하는 색은 녹색이나 파란색이 아닙니다.

코드는 다음과 같습니다.

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

}

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

12
아니, 우리가 이미 가지고 있기 때문에 or그리고 !대부분의 사람들이 특히 어려운 읽고 찾아 - 더블 네거티브는 거의 사용되지 않는다 때문이다.
Kilian Foth

70
@KilianFoth가 맞습니다. 그럼에도 불구하고 다운 보트는 우리가 싫어하는 질문이 아니라 나쁜 질문에 대한 것이어야합니다. 또한, 질문이 완전히 중립적이고 논란의 여지가 있지만 (이국적인 언어로 된 연산자가 있거나없는) 질문에 대해 "의견에 기반을 둔"것이기 때문에 질문을 종결하기 위해 이미 3 개의 투표가 있습니다.
Christophe

3
이름이 있습니까? 예 : 아닙니다. 운영자입니까? 어떤 언어로? 그리고 언어가 주어지면 스펙 / 문서에서 찾을 수 있습니다.
jonrsharpe

9
@Troyer 귀하의 의견은 문제를 보여줍니다. 논리가 잘못되었습니다. ;) 그것은 nor와 동일하지 않습니다.
jpmc26

3
연산자가 더 많은 언어의 경우 (예 : 파이썬)color not in ['green', 'blue']
Izkata

답변:


72

주류 언어에는 전용 NOR 및 NAND 연산자가 없지만, 덜 알려진 일부 언어 (예 : "골프"언어)가 있습니다. 예를 들어, APL이 보유 하고 , 각각에 대한 NOR 및 NAND를.

VHDL , Verilog 등과 같은 하드웨어 디자인 언어에서 다른 클래스의 예제를 찾을 수 있습니다 . NAND 및 NOR 게이트는 일반적으로 AND / OR / NOT로 만든 등가 회로보다 저렴하기 때문에 (트랜지스터 수가 적음) 하드웨어 설계에 매우 유용합니다. 하드웨어 디자인 언어가 게이트를 포함하는 이유 중 하나 인 게이트; 또 다른 이유는 특정 비트 인증 트릭에 유용 할 수 있기 때문입니다.


40
APL은 골프 언어 가 아니라 어레이 지향 언어로서 산업 수준의 풀 스택 멀티 패러다임 응용 프로그램을 대화식으로 개발할 수 있습니다.
Adám

59
@ Adám : 빙고 .
Eric Duminil

6
@EricDuminil :-) 그래도 사실입니다.
Adám

20
@EricDuminil 아뇨. APL은 골프 언어가 아니며 골프에 능숙한 실용적인 언어입니다. 펄은이 점에서 비슷합니다.
Pavel

13
OP는 실제로 APL이 "골프"언어라고 말하지 않았다.
윌 크로포드

46

아니요, nor고급 주류 프로그래밍 언어 에는 운영자 가 없습니다 .

왜 ?

주로 읽기 어렵 기 때문에 :

  • 여러 연산자의 정신적 조합이 필요합니다 ( "" 가 아닌 "또는보다 문학적 스타일 : " 추가 부정적인 "," 각각의 사실이 아닙니다 " ).
  • not첫 번째 피연산자에 암시적임을 암시 하지만 독자는 나중에 이것을 이해합니다.
  • " x 및 y ", " nor x nor 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

까지 루프 사용

일부 언어는 또한와 함께 while또는로 조건을 표현할 수있는 루프 명령어를 제공 until하므로보다 "긍정적 인"방법을 선택할 수 있습니다. 이 지침은, 예를 들어 있습니다 until c do ...에서 루비 , do until c ...에서 비주얼 베이직 , 또는 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
    ...  

독자는 부정이 모든 인수에 적용된다는 것을 즉시 이해하기 때문에 연산자보다 함수의 가독성 이점이 있습니다. 일부 언어에서는 가변 개수의 인수로 함수를 정의 할 수 있습니다.


5
재미, 나는 일반적으로 쓰는 것과 while (not (x == 1 or x == 2))내가 찾을로 x != 1 and x != 2읽고 찾을 수있는 하드 버전의 "x는 1 아니며, x는 2 아니다"보다 처리하기가 훨씬 쉽다 "x는 없다 어느 쪽도 1,도 2".
Mael

1
@Baldrickk 당신은 정교한 수 있습니까?
희망적으로 도움이 된

4
@HopefullyHelpful Repeat... Until항상 루프 본문을 적어도 한 번 실행합니다. x가 1이면 루프 본문은 여전히 ​​실행되지만 반복되지는 않습니다. 이 경우 While루프는 본문을 실행하지 않습니다.
시나

2
@ Baldrickk 네, 당신은 완전히 옳습니다. 동등한 글을 쓸 때 부울 연산자가 문제의 주제이기 때문에 루프 조건에 대해서만 이야기했습니다. 고마워요, 명확하게 다시 말씀 드리겠습니다
Christophe

3
x와 y nor(x,y)는 항상 언어와 nor()구현 방법에 따라 평가 됩니다. 호출 된 함수가 인수를 평가할시기와시기를 결정할 수있는 언어 (D, Io,…)가 있습니다.
BlackJack

18

이 질문에 대한 @KilianFoth의 의견은 바로 그 자리에 있습니다.

당신은 합성 할 수 nor에서 notor:

if (x nor y)

정확히 동일

if (not (x or y))

nor별도의 연산자로 소개 하면 필요하지 않거나 원하지 않는 (또는 필요하지 않고 원하지 않는) 언어에 중복성이 도입됩니다.

마찬가지로, 나는 nand연산자를 가진 언어를 알지 못합니다. 아마 언어 notand연산자 에서 합성 될 수 있기 때문일 것입니다 .

이론적으로는 연산자 만 사용 nand하거나 언어 만 만들 수 있습니다 nor. 모든의는 and, or그리고 not그때까지 그들로부터 synthesied 수 있습니다. 유일한 문제는 이것이 엄청나게 다루기 힘들다는 것입니다. 예를 들어 Wikipedia의 NOR 논리NAND 논리 를 참조하십시오 .


4
이중화도 필요하거나 원하지 않을 수 있습니다 :)
Dave

@Dave 그 말장난은 의도 된 것을 보게되어 기쁘다 ;-)
Mael

5
중복성만으로는 왜 nor포함 되지 않는지 실제로 설명 하지 않습니다. 그렇지 않으면 언어에 왜 andor? De Morgan 덕분에 중복됩니다. 사실, 당신은 세 가지 기존의 논리 연산자 (대체 할 수 and, or, not제공) 단지 nor 당신이 바르게 관찰.
Konrad Rudolph

1
@KonradRudolph 기술적 으로 람다 연산자 만 있으면 됩니다. 우리가 더 많은 이유는 대부분의 프로그래머가 가진 정신 모델과 일치하기 때문입니다. 대부분의 프로그래머의 관점에서 논리의 생각 and, or그리고 not- 그 대부분의 인간의 언어는 무엇을 사용하기 때문이다. 일단 당신의 정신적 모델과 일치하거나 일치하지 않으면, 중복되지도 않습니다. 그들의 중복성은 "n (ot) and"및 "n (ot) or"라는 이름으로 인코딩됩니다. 만약 우리가 합성 된 단어뿐만 아니라 그들에 대한 기존의 영어 용어를 가지고 있다면, 아마도 더 자주 보게 될 것입니다.
RM

1
인수로 중복 다시 :보다 더와 언어가있다 not, and,는 or. 예를 들어, 일부 기본 방언 (GW-BASIC, QuickBASIC,…)에는 추가 연산자로서 배타적 또는 XOR, 의미 IMP (→ NOT (x XOR y)) 및 동등성 EQV (→ NOT (x) OR y)가 있습니다.
BlackJack

11

예, APL 과 일부 방언에는 nor (및 nand )가 있습니다. APL에서, 표시된다 (이후 이나~있다 없습니다 )

 resultExampleOne color
  :If (color'green')⍱(color'blue')
      result'warm'
  :Else
      result'cold'
  :EndIf


 resultExampleTwo(x y)
  :If xy
      result'x is false and y is false'
  :Else
      result'at least one of them is true'
  :EndIf

온라인으로 사용해보십시오!


10

이 답변은 1960 년대 중반에 만들어진 컴퓨터의 어셈블러 언어에서 나온 것입니다. 꽤 모호하지만 일부 측면에서 귀하의 질문을 해결합니다.

DEC (Digital Equipment Corporation)는 1960 년대 중반 PDP-6 컴퓨터를 출시했습니다. 이 기계에는 두 개의 피연산자 (일부 퇴화 사례 포함)에 대한 부울 연산 인 총 64 개의 명령어가있었습니다. 이 64 개의 명령어는 실제로 각 연산자마다 4 개의 변형이있는 16 개의 연산자입니다.

ANDCB와 ORCB 연산자 중 2 개는 NOR과 NAND를 각각 구현했습니다 (이중 부정 논리에서 혼동되지 않는 한). opcode 테이블을 볼 수 있습니다 . opcode 테이블은 실제로 PDP-6의 후속 제품인 PDP-10 컴퓨터를위한 것입니다.

이진수로 수치 명령을 보면 더 흥미로워집니다. 400-477 (8 진수) 범위의 모든 opcode에 대해 명령어 자체의 4 비트는 16 개의 부울 연산자에 대해 4 비트 진리표를 제공합니다. 이 연산자 중 일부는 입력 중 하나 또는 둘 다를 무시합니다. 예를 들어 SETZ 및 SETO는 두 입력을 모두 무시합니다.

PDP-6의 설계자들은이 사실을 이용하여 이들 명령을 일부만 구현하는 것보다 적은 논리로 모든 명령을 구현했습니다. 이러한 명령어 중 일부는 어셈블리 언어 코드에서 거의 나타나지 않았습니다. 그러나 그들은 모두 거기에있었습니다.

따라서 ANDCB는 NOR과 같습니다. (내 논리를 거꾸로하지 않는 한 ORCB는 동일합니다).


3

Perl에는 unless조건을 뒤집을 수 있는 키워드가 있습니다.

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

NOR 연산자는 아니지만 비슷한 방식으로 의도를 표현할 수 있습니다.


3

nor운영자는 당신이 그것을 발견하기 어려운 버그의 많은으로 이어질 수밖에 없다, 이는 반복되지 않을 것 설명한다.

"예제 2"는 기본적으로 다음과 같습니다.

if (false nor false) {
becomes
if (true) {

그러나 세 가지 변수를 사용하여 다시 시도하고 결과를 확인하십시오.

if (false nor false nor false) {
becomes
if ((false nor false) nor false) {
becomes
if (true nor false) {
becomes
if (false) {
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.