2010-11-14 14 views
21

Câu hỏi của tôi sử dụng Java làm ví dụ, nhưng tôi đoán nó có thể áp dụng cho tất cả.Sự khác nhau giữa XOR và NOT-EQUAL-TO là gì?

Có sự khác biệt thực tế nào giữa toán tử XOR (^ trong java) và NOT-EQUAL-TO (! = Trong java), khi so sánh các boolean không?

Tôi đã đánh giá mọi thứ ở đây, nhưng tôi cứ tự hỏi (có vẻ kỳ lạ, hai điều bình đẳng) ... và không tìm thấy gì trên mạng. Chỉ cần một cuộc thảo luận trong một số diễn đàn kết thúc nhanh chóng mà không có kết quả nào.

+0

Một số cuộc thảo luận có liên quan trong câu hỏi này (cá nhân tôi sẽ không coi đó là một bản sao, mỗi lần nói): http://stackoverflow.com/questions/160697/is-it-good-practice-to-use-the- xor-operator-in-java-for-boolean-checks – eldarerathis

+0

Một lưu ý tiếp tuyến: Như các câu trả lời dưới đây đã nói, hai toán tử có ý nghĩa tương tự đối với các boolean. Điều này không đúng trong trường hợp chung, ít nhất là trong C++. Vì các toán tử có thể bị quá tải trong C++, các toán tử '! =' Và '^' có thể hoặc không thể làm điều tương tự. Bên cạnh đó, sử dụng '! =' Trái ngược với '^' làm cho nó khá rõ ràng rằng một thử nghiệm về sự bất bình đẳng đang được thực hiện. –

+0

Tôi xin lỗi, tôi thậm chí không thấy câu hỏi đó, có thể vì các tên sách khác nhau và người xác minh câu hỏi không hiểu được. Dù sao, câu trả lời ở đây tốt hơn nhiều và chứng ngộ, theo quan điểm khiêm nhường của tôi. Về những gì được nói ở đó ... Tôi có xu hướng đồng ý: nếu bạn sắp tiết kiệm một trong số ít chữ cái để lại mã càng tối nghĩa, tôi thích đi sâu hơn. Tôi sẽ gắn bó với! = Trong những tình huống này. – davidcesarino

Trả lời

26

Đối với các giá trị Boolean, họ ý nghĩa giống nhau - mặc dù có một nhiệm vụ điều hành ghép cho XOR:

x ^= y; 

Không có phân công hợp chất tương đương toán tử cho sự bất bình đẳng.

Đối với lý do tại sao cả hai đều có sẵn - nó sẽ là lạ đối với XOR không phải để có sẵn chỉ vì nó hoạt động theo cách tương tự như bất bình đẳng. Nó nên hợp lý ở đó, vì vậy nó được. Đối với các loại không phải là Boolean, kết quả khác nhau vì đó là một loại kết quả khác, nhưng điều đó không có nghĩa là sẽ loại bỏ XOR cho boolean.

+0

Vâng, đó là những suy nghĩ của tôi chính xác! Tôi chỉ muốn chắc chắn bởi vì nói chung tôi không thấy nhiều thứ mà về cơ bản là cùng phục vụ cùng một mục đích (một dao cạo của Occam các loại tôi đoán ...). Mối quan tâm này rõ ràng không áp dụng cho ternary, đó là, tất nhiên, một cách tốt hơn và cách sạch hơn để làm điều tương tự. Nhưng với trường hợp của tôi ở đây nó thực sự chỉ giống nhau. Nhưng có, bạn đã đúng về vấn đề và câu hỏi của tôi. Cảm ơn bạn. – davidcesarino

0

Về cơ bản, chúng cũng giống nhau.

0

Có một sự khác biệt lớn, XOR làm việc tại chút cấp, giữ chênh lệch như những người thân, nên 0b0011 xor 0b1101 => 0b1110

regards, // t

+4

ah, so sánh booleans ... Không, không có sự khác biệt .. – Teson

3

Có, bạn có thể sử dụng XOR để kiểm tra booleans cho (bằng) bình đẳng, mặc dù mã ít trực quan hơn: if (x^y) so với if (x != y).

3

Với giá trị boolean, không có sự khác biệt. Bạn nên chọn cái nào phù hợp hơn với ý thức hoạt động của bạn.

Ví dụ:

bool oldChoice = ...; 
bool newChoice = ...; 
if (oldChoice != newChoice) 
    ... 

Đây XOR sẽ cung cấp cho các kết quả tương tự, nhưng sẽ không phản ánh ý định mã thực.

19

Như đã nêu trong Java Language Specification:

Kết quả của = là false nếu toán hạng đều đúng hoặc cả hai false; nếu không, kết quả là đúng. Do đó! = Hoạt động giống như^(§15.22.2) khi áp dụng cho toán hạng boolean.

Ngoài ra nếu bạn cố gắng nhìn vào bytecode của một đoạn đơn giản:

void test(boolean b1, boolean b2) { 
    boolean res1 = b1^b2; 
    boolean res2 = b1!=b2; 
} 

bạn có được:

test(ZZ)V 
    L0 
    LINENUMBER 45 L0 
    ILOAD 1 
    ILOAD 2 
    IXOR 
    ISTORE 3 
    L1 
    LINENUMBER 46 L1 
    ILOAD 1 
    ILOAD 2 
    IXOR 
    ISTORE 4 
    L2 
    LINENUMBER 47 L2 
    RETURN 
    L3 

này đảm bảo rằng, ngoài việc cùng một ngữ nghĩa, không có bất kỳ sự khác biệt thực tế thực tế trong thực hiện. (Bạn cũng có thể thấy rằng trong nội bộ ints được sử dụng để lưu trữ các giá trị boolean)

+0

Cảm ơn bạn rất nhiều vì lời giải thích sâu sắc về cách thức hoạt động! – davidcesarino

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