2009-12-09 7 views
11

내 머리 꼭대기에서 논리적 배타적 또는 연산자를 사용하는 단일 언어를 생각할 수는 없지만 논리와 비트가 모두 andor 인 연산자가 있습니다.왜 많은 언어에 논리 XOR 연산자가 부족합니까?

주위를 둘러 보니 내가 찾을 수있는 유일한 이유는 독점적이거나 단락 될 수 없었기 때문에 논리적 버전은 쓸모가 없었습니다. 사실은 그렇지 않습니다. 그 이유는 대부분의 언어가 부족하다는 것이 었습니다. (루비를 사용했기 때문에 정수를 부울로 변환 한 다음 비트마다 XOR을 사용했습니다. 부울은 논리 XOR과 같은 역할을합니다) .

그냥 비트 연산을 사용하면 XOR이 작동하지 않습니다. 다른 결과를 나타 내기 때문입니다.

0b0001^0b1000 = 0b1001 (True) 
0b0001 XOR 0b1000 = False 
// Where^is bitwise exclusive or and XOR is logical exclusive or 
// Using != (not equal to) also doesn't work 
0b0001 != 0b1000 = True 

왜 대부분의 언어에는 논리 배타적 논리합이나 연산자가 포함되어 있지 않습니까?

편집가 : 당신이 알고 있다면 내가하고 싶은 일을하지 않는 방법 !=도에 예를 추가, 거의 않지만, 전용 비트를 사용하거나 수행하는 같은 문제에 빠지고, 만 작동 다른 번호가 아닌 0 또는 1로 작업하고 있습니다.

참고로, 언어는 0을 거짓으로, 0이 아닌 값을 true로 가정합니다.

+0

두 번째 예에서는 true가 아닌 값을 사용하는 언어를 사용합니다. – caskey

+1

논리 XOR과 같지 않음이 어떻게 다른지 예를 들려 줄 수 있습니까? –

+2

* 실제 * 여기에 "논리 연산자를 논리 값이 아닌 값으로 사용하려고하는 이유는 무엇입니까?" 이것은 의미 론적으로 무효하고 프로그래밍에 익숙하지 않습니다. – RBarryYoung

답변

3

좋아, 따라서 바이트 현명한 단독 또는 비트 현명한 배타적 또는 대 찾고 있습니다. 바이트가 "0"또는 "0이 아닌"것으로 생각되면 "켜짐"또는 "꺼짐"으로 바이트에서 작동하는 무언가를 찾고있는 것처럼 보입니다. true 또는 false를 나타내는 단일 비트로 각 바이트를 압축하려고합니다. 그래서, 당신이 원하는 것처럼 들리 네요 (a! = 0)^(b!= 0)

 
a b a YOURXOR b a!=0 b!=0 (a!=0)^(b!=0) 
0 0   0   0  0  0   
0 1   1   0  1  1 
1 0   1   1  0  1 
7 0   1   1  0  1 
0 7   1   0  1  1 
3 7   0   1  1  0 
7 3   0   1  1  0 
7 7   0   1  1  0 

모든 언어에있는 이유는 무엇입니까? 나는 정말로 대답 할 수 없습니다. 그러나 모든 언어에서 사용할 수있는 bitwise xor의 구성 요소로 구현하는 것이 어렵지 않으며 가능한 모든 기능을 제공하는 언어가 없습니다. 필요한 확장 기능을 구현할 수 있도록 충분히 제공됩니다. 아, 그리고 이것이 대중적인 문제라면, 도서관이나 매크로를 볼 수있을 것입니다. 그런 libs/코드에 대한 충분한 검색을하지는 못했지만 요구 사항이 작성하기가 쉽지 않거나 틈새 요구 사항임을 나타내는 어떤 것도 찾지 못했습니다.

+2

내 생각에! ^! b 작품. 특히 Ruby에서'! x'는 부울입니다 –

3

내가 생각할 수있는 유일한 이유는 조작이 비교적 드뭅니다. 왜 ^^ 같은 것을 할당 할 수 없었는지 모르겠다. 어쩌면 언어를 디자인하는 사람들은 조작자 혼란을 피하기를 원할지도 모른다.

단락 될 수 없으므로 쓸모가 없다는 이유로 많은 강하게 입력 된 언어에서 앞뒤로 캐스팅하지 않고 부울을 비교하기 위해 비트 XOR 연산자를 사용할 수 없습니다. 논리 XOR을 회로화하는 것은 의미가 있습니다.

1

아마 XOR은 일반적으로 논리 연산자로 필요하지 않기 때문에, 당신은이만큼이나 쉽게 수행 할 수 있습니다

// foo xor bar 
(foo & !bar) || (bar & !foo) 

// or like this (assuming foo and bar are booleans) 
!(foo==bar) 

// assume boleans that can be cast as integers with true=1 and false=0 
// foo XOR bar XOR baz XOR alice 
((int)foo + (int)bar + (int)baz + (int)alice)&0b1 
+0

그런데 3 ~ 4 개의 테스트가 복잡해집니다. –

+0

네, 그렇지만 언어 디자이너가 신경 쓰지 않을 정도로 희귀 한 것 중 하나 일뿐입니다. 좋은 대답은 – MadCoder

17

거의 모든 언어는 논리적 인 XOR 있습니다. 그들이 사용하는 상징은 다양하지만 기호에 관계없이 대부분의 사람들은 그것을 "평등하지 않다"고 선언합니다.

편집 : 세 가지 변수, 테스트 코드를 의심하는 사람들을 위해 :

#include <iostream> 

int main() { 
    for (int i=0; i<2; i++) 
     for (int j=0; j<2; j++) 
      for (int k=0; k<2; k++) { 
       std::cout << "\n!=" << (i!=j!=k); 
       std::cout << "\t^ " << (i^j^k); 
      } 
    return 0; 
} 
+0

+0.5입니다. 적절한 snarkiness에 대해 +0.5. –

+9

부울 컨텍스트를 보장 할 수 없다면 미묘한 버그를 묻는 것입니다. –

+2

대부분의 언어에는 비트 XOR이 있지만 ** 논리 **에는 없습니다. "같지 않음"은 견인 피연산자의 경우에도 동일하게 작용하지만, 나는 생각하지 않습니다! = b! = c는 XOR b XOR c와 같습니다. – MadCoder

5

당신이 "논리적 인 XOR 연산자"무엇을 의미합니까? 나는 당신이 당신의 예에서 기대하는 어떤 결과 모르겠지만, 여기 내 대답 :

a (logical XOR) bbool(a) != bool(b)

불평등 논리 XOR입니다 동일합니다. 이미 비트 XOR 버전을 가지고 있기 때문에 논리 연산자에 특별한 연산자가 필요하지 않습니다.

5

논리 xor와 동일한 효과를 얻으려면 !a^!b을 쓸 수도 있습니다.

  • 는 매우 효율적인 어셈블리 코드를 생성하지 않습니다
  • 언어 설계자들이 줄을 추가해야
  • 매우 자주 필요하지 않습니다 : 때문에

    당신은 아마 프로그래밍 언어의 논리적 XOR을 찾을 수없는 어딘가에 왜 NAND, NOR, NXOR 등이 아닌지

+0

+1 왜냐하면 나는 선을 그 어딘가에 그리는 것을 좋아했습니다. – mikek3332002

관련 문제