2017-02-25 17 views
9

Ví dụ:Có thể sử dụng XOR để phát hiện xem chính xác một trong nhiều điều kiện có đúng không?

if (bool1^bool2^bool3^bool4) 
{ 
    // Do whatever 
} 

Chỉ nên thực hiện khi đáp ứng chính xác một trong các điều kiện.

+4

Có thể viết điều đó, nhưng nó có thể không làm những gì bạn muốn. Xây dựng bảng chân lý để cho bạn thấy kết quả của tất cả 16 kết hợp để quyết định xem đó có phải là điều bạn muốn hay không. Tuyên bố của bạn _ "chỉ khi một trong các điều kiện được đáp ứng" _ là mơ hồ. Như được viết, đơn giản bao gồm hoặc sẽ đủ. Bạn có nghĩa là _ "chỉ khi chính xác MỘT trong các điều kiện được đáp ứng" _? –

+1

Tại sao bạn không thử và cho chúng tôi biết? Hoặc quay lại nếu bạn có câu hỏi sau khi thử. –

+1

@Esko, nó không phải là một bản sao. –

Trả lời

7

Thêm bools với nhau như số nguyên và kiểm tra xem họ bằng 1.

Trong một ngôn ngữ nơi đúc từ một boolean để một số nguyên không hoạt động, chẳng hạn như Java, tùy chọn dài hơn hơi là:

if ((bool1 ? 1 : 0) + (bool2 ? 1 : 0) + (bool3 ? 1 : 0) + (bool4 ? 1 : 0) == 1) { 
    // only runs when one of bool 1-4 is true 
} 

Tuy nhiên, bằng các ngôn ngữ khác, nơi đúc một boolean để một số nguyên là hợp lệ, bạn có thể làm như sau:

if ((int)(bool1) + (int)(bool2) + (int)(bool3) + (int)(bool4) == 1) { 
    // only runs when one of bool 1-4 is true 
} 
+0

Có thể là ngắn hơn nhiều, nhưng vẫn upvoted. –

+0

Điều đó sẽ hoạt động, cảm ơn –

+0

Vì thẻ này được gắn thẻ 'java'," một ngôn ngữ mà việc truyền từ một boolean đến một số nguyên không hoạt động "là một cái đã cho. –

2

là một thay thế, đây là một giải pháp dựa trên luồng:

boolean b0 = false; 
boolean b1 = false; 
boolean b2 = true; 
boolean b3 = false; 

boolean result = Stream.of(b0, b1, b2, b3) 
    .mapToInt(b -> b ? 1 : 0) 
    .sum() == 1; 

System.out.println(result); 

Có lợi thế là nó có thể dễ dàng được áp dụng cho 3 hoặc 5 giá trị boolean hoặc để thực hiện chung phương thức boolean exactlyOne(boolean ... b).

+1

'.reduce (Integer :: sum) .getAsInt()' có thể được viết là '.sum()' vì chúng ta đã có một 'IntStream' tại thời điểm này, phải không? – Hulk

+0

@Hulk Right, thậm chí còn tốt hơn – Marco13

0

biểu hiện của bạn sẽ không làm việc vì nó có nghĩa

(((bool1^bool2)^bool3)^bool4) 

Giả sử bool1 = bool2 = bool3 = truebool4 = false. Biểu thức thái quá sẽ cung cấp cho true.

Bạn có thể có nghĩa là một số khái quát hóa XOR, nhưng có một số trong số đó. Người ta có thể làm việc như bạn đã nói, nhưng thường thì nó có nghĩa là số lẻ. Dù sao, hầu hết các ngôn ngữ lập trình không có nó ra khỏi hộp.

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