Có toán tử XNOR (logic nhị phân) trong C # không?


136

Tôi mới sử dụng C # và không thể tìm thấy toán tử XNOR để cung cấp bảng chân lý này:

aba XNOR b
----------------
TTT
TFF
FTF
FFT

Có một nhà điều hành cụ thể cho việc này? Hoặc tôi cần sử dụng! (A ^ B)?


94
Toán tử này thường được biết đến nhiều hơn ==với các toán hạng boolean ...
Magnus Hoff

@Magnus Hoff: điểm rất hay!
sll

24
Tôi nghĩ rằng cụm từ "không thể nhìn thấy gỗ cho cây" rất thích hợp ở đây. Bỏ phiếu vì tất cả chúng ta đã ở đây một hoặc hai lần;)
tiêu

1
Có lẽ OP iz l33t k! D, người muốn viết shellcodez tuyệt vời và cần bằng cách nào đó ẩn hoạt động so sánh. Đó là một khả năng ...
Kerrek SB

4
xin lỗi, Kerrek, tôi không đến từ đám đông đó Và người chi tiêu hoàn toàn đúng ở đây -)
trailmax

Câu trả lời:


250

XNOR đơn giản là bình đẳng trên booleans; sử dụngA == B .

Đây là một điều dễ bỏ lỡ, vì sự bình đẳng không được áp dụng phổ biến cho booleans. Và có những ngôn ngữ mà nó sẽ không nhất thiết phải làm việc. Ví dụ, trong C, mọi giá trị vô hướng khác không được coi là đúng, vì vậy hai giá trị "đúng" có thể không bằng nhau. Nhưng câu hỏi đã được gắn thẻ, trong đó, chúng ta sẽ nói, booleans cư xử tốt.

Cũng lưu ý rằng điều này không khái quát cho các hoạt động theo bit, nơi bạn muốn 0x1234 XNOR 0x5678 == 0xFFFFBBB3(giả sử 32 bit). Đối với điều đó, bạn cần xây dựng từ các hoạt động khác, như ~(A^B). (Lưu ý : ~, không !.)


6
Trong C, !toán tử có thể được sử dụng để chuyển đổi intcác booleans "hoạt động tốt" : !a==!b.
ivan_pozdeev

2
@ivan_pozdeev Và !!(đó là hai toán tử "không" logic) bình thường hóa mọi giá trị vô hướng thành 0hoặc 1.
Keith Thompson

5

XOR = A hoặc B, nhưng không phải A & B hoặc không (Không thể bằng [! =])
XNOR do đó là oppoiste chính xác và có thể dễ dàng được biểu thị bằng == hoặc ===.

Tuy nhiên, các trường hợp không phải là boolean có vấn đề, như trong ví dụ này:

a = 5
b = 1

if (a == b){
...
}

thay vào đó, sử dụng cái này:

a = 5
b = 1

if((a && b) || (!a && !b)){
...
}

hoặc là

if(!(a || b) && (a && b)){
...
}

ví dụ đầu tiên sẽ trả về false (5! = 1), nhưng ví dụ thứ hai sẽ trả về giá trị true (a [value?] và b [value?] trả về cùng boolean, true (value = not 0 / có một giá trị )

ví dụ alt chỉ là cổng đảo ngược (a || b) &&! (a && b) (XOR)


3

Không, bạn cần sử dụng !(A^B)

Mặc dù tôi cho rằng bạn có thể sử dụng quá tải toán tử để tạo XNOR của riêng bạn.


1
Đây là bitwise, không phải là logic
sll

Tôi nghĩ rằng người đăng biết rằng anh ấy đã đưa nó vào câu hỏi của mình.
Griffin

4
@sllev bạn gần như đã hiểu tôi, tôi phải kiểm tra lại. Trong C # ^ là hợp lý nếu hoạt động trên boolean. Nếu hoạt động trên các loại tích phân, nó là bitwise. Vui lòng xem msdn.microsoft.com/en-us/l
Library / zkacc7k1.aspx

@trailmax: công cụ tuyệt vời, cảm ơn bạn đã chỉ vào điều này! Thực sự ma quỷ là chi tiết!
sll

-6

Bạn có thể sử dụng ===toán tử cho XNOR. Chỉ cần bạn cần chuyển đổi abbool.

if (!!a === !!b) {...}

1
chỉ C # không có ===nhà điều hành
trailmax

Không có câu trả lời nào là đúng, ===toán tử không ép buộc là javascript và double!! trước một giá trị trong đánh giá không hợp lệ trong c #
Remi

như đã nêu, c # không có Toán tử ký ba bằng nhau.
nhồi nhét

=== không phải là một toán hạng trong C # ... (===) được sử dụng là JavaScript.
Darkcoder
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.