2009-12-09 23 views
11

Tắt đầu của tôi, tôi không thể nghĩ ra một ngôn ngữ mà tôi đã sử dụng có một toán tử logic hoặc độc quyền, nhưng tất cả đều có các toán tử logic và bitwise andor.Tại sao nhiều ngôn ngữ thiếu một toán tử XOR logic?

Nhìn xung quanh, lý do duy nhất mà tôi có thể tìm thấy là độc quyền hoặc không thể bị đoản mạch, vì vậy một phiên bản hợp lý sẽ vô ích, điều mà tôi thực sự không thể thấy được. Lý do tôi nhận thấy rằng hầu hết các ngôn ngữ thiếu điều này là tôi cần nó (tôi đã sử dụng Ruby, vì vậy tôi đã viết một phương pháp để chuyển đổi một số nguyên thành boolean, và sau đó sử dụng XOR bitwise, trên booleans hoạt động như XOR logic) .

Chỉ cần sử dụng bitwise XOR không hoạt động, vì nó sẽ cho kết quả khác.

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 

Vậy tại sao hầu hết các ngôn ngữ không bao gồm toán tử hoặc toán tử logic?

Sửa: Tôi thêm một ví dụ với cách != cũng không làm những gì tôi muốn, nó hầu như không có gì, nhưng rơi vào cùng vấn đề rằng việc sử dụng Bitwise độc ​​quyền hay không, nó chỉ hoạt động nếu bạn biết rằng bạn đang làm việc với số không hoặc một và không phải bất kỳ số nào khác.

Và để lưu ý, điều này giả định rằng ngôn ngữ sử dụng 0 là sai và không phải là đúng.

+0

Trong ví dụ thứ hai của bạn, nó giả định một ngôn ngữ sử dụng khác không đúng. – caskey

+1

Bạn có thể đưa ra một ví dụ về cách XOR hợp lý của bạn khác nhau không? –

+2

* real * ở đây là "Tại sao bạn lại cố gắng sử dụng các toán tử logic trên các giá trị phi boolean?" Đó là thực hành lập trình không hợp lệ và không hợp lý để bắt đầu. – RBarryYoung

Trả lời

3

OK, vì vậy, bạn đang tìm kiếm byte độc quyền khôn ngoan hoặc so với bit khôn ngoan hoặc độc quyền. Có vẻ như bạn đang tìm kiếm thứ gì đó sẽ hoạt động trên một byte là "bật" hoặc "tắt", như nghĩ rằng các byte là "0" hoặc "nonzero", sau đó XOR chúng. Nó thực sự có vẻ như bạn đang tìm cách để nén từng byte vào một bit duy nhất cho thấy đúng hay sai. Vì vậy, nó có vẻ như bạn muốn (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 

Vì lý do không có trong mọi ngôn ngữ ... mà tôi không thể trả lời được. Tuy nhiên, không khó để thực hiện với các khối xây dựng bito xor có sẵn trong mọi ngôn ngữ và không có ngôn ngữ nào cung cấp tất cả các chức năng có thể - chúng chỉ cung cấp đủ để cho phép bạn xây dựng chức năng mở rộng mà bạn có thể cần. Oh, và nếu đây là một vấn đề đủ phổ biến, bạn sẽ mong đợi để xem các thư viện hoặc macro trên khắp nơi cho nó; trong khi tôi có thể không thực hiện tìm kiếm đầy đủ cho các mã/lib như vậy, tôi không tìm thấy bất kỳ bản thân nào, chỉ ra rằng yêu cầu hoặc là nhỏ nhặt để viết, hoặc một yêu cầu thích hợp.

+2

Tôi nghĩ! A ^! B cũng hoạt động. Cụ thể là nó hoạt động trong Ruby như '! X' là bool –

3

Lý do duy nhất tôi có thể nghĩ là hoạt động tương đối hiếm. Tôi không hiểu tại sao một cái gì đó như ^^ không thể được gán cho nó mặc dù, có lẽ những người thiết kế ngôn ngữ muốn tránh lộn xộn nhà điều hành.

Vì nó vô dụng vì không thể đoản mạch được, trong nhiều ngôn ngữ được đánh máy mạnh, bạn không thể sử dụng toán tử XOR bitwise để so sánh các phép toán mà không cần truyền qua lại, trong trường hợp này mạch logic XOR sẽ có ý nghĩa để có.

1

Có lẽ vì XOR không cần thiết thông thường như một nhà điều hành hợp lý, và bạn có thể làm điều đó gần như là một cách dễ dàng như thế này:

// 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

Điều đó sẽ phức tạp cho ba hoặc bốn bài kiểm tra. –

+0

Đúng, nhưng đó chỉ là một trong những điều hiếm hoi cho các nhà thiết kế ngôn ngữ không quan tâm. – MadCoder

17

Gần như mỗi ngôn ngữ có một XOR logic. Biểu tượng họ sử dụng cho nó thay đổi, nhưng bất kể biểu tượng, hầu hết mọi người phát âm nó "không bằng nhau".

Edit: cho những ai nghi ngờ, mã kiểm tra cho ba biến:

#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 để có câu trả lời hay. +0.5 cho sự lố bịch thích hợp. –

+9

Nếu bạn không thể đảm bảo một bối cảnh boolean, đó là yêu cầu cho các lỗi tinh tế. –

+2

hầu hết các ngôn ngữ đều có XOR bitwise, nhưng không phải là một ** logic **. "không bằng nhau" hoạt động giống nhau trong trường hợp toán hạng tow, nhưng tôi không nghĩ rằng a! = b! = c tương đương với XOR b XOR c. – MadCoder

5

Ý anh là gì bởi "điều hành XOR logic"? Tôi không chắc chắn những gì kết quả bạn mong đợi từ các ví dụ của bạn, nhưng đây là câu trả lời của tôi:

a (logical XOR) b cũng giống như bool(a) != bool(b)

bất bình đẳng là một XOR logic. Vì bạn đã có phiên bản XOR bitwise, bạn không cần một toán tử đặc biệt cho phiên bản logic.

5

Bạn cũng có thể viết !a^!b để có hiệu ứng tương tự như xor hợp lý.

Bạn có lẽ không tìm xor logic trong ngôn ngữ lập trình bởi vì:

  • nó không tạo ra mã lắp ráp rất hiệu quả
  • là không cần thiết rất thường xuyên
  • nhà thiết kế ngôn ngữ phải đặt dòng một nơi nào đó, tại sao không NAND, NOR, NXOR, v.v.
+0

+1 bởi vì tôi thích phải vẽ đường kẻ khác – mikek3332002

Các vấn đề liên quan