มี XNOR (Logical biconditional) ตัวดำเนินการใน C # หรือไม่


140

ฉันเพิ่งเริ่มใช้ C # และไม่พบตัวดำเนินการXNORเพื่อให้ตารางความจริงนี้:

aba XNOR ข
----------------
อปท
TFF
FTF
FFT

มีตัวดำเนินการเฉพาะสำหรับสิ่งนี้หรือไม่? หรือฉันต้องใช้! (A ^ B)?


95
ตัวดำเนินการนี้เป็นที่รู้จักกันทั่วไปใน==ชื่อบูลีนตัวถูกดำเนินการ ...
Magnus Hoff

1
@Magnus Hoff: จุดที่ดีมาก!
sll

24
ฉันคิดว่าวลี "มองไม่เห็นไม้สำหรับต้นไม้" มีความเหมาะสมอย่างยิ่งที่นี่ โหวตให้เพราะเราเคยมาที่นี่ครั้งหรือสองครั้ง;)
ใช้จ่าย

1
บางที OP iz l33t k! d ที่ต้องการเขียน shellcodez ที่ยอดเยี่ยมและต้องการซ่อนการดำเนินการเปรียบเทียบ เป็นไปได้ ...
Kerrek SB

5
ขอโทษ Kerrek ฉันไม่ได้มาจากฝูงชนนั้น และอะไรต่อมิอะไรอยู่ตรงนี้ -)
trailmax

คำตอบ:


255

XNOR คือความเท่าเทียมกันของบูลีน ใช้A == B.

นี่เป็นสิ่งที่พลาดได้ง่ายเนื่องจากความเท่าเทียมกันไม่ได้ใช้กับบูลีนโดยทั่วไป และมีภาษาที่ไม่จำเป็นต้องใช้งานได้ ตัวอย่างเช่นใน C ค่าสเกลาร์ที่ไม่ใช่ศูนย์จะถือว่าเป็นจริงดังนั้นค่า "จริง" สองค่าจึงไม่เท่ากัน แต่คำถามถูกแท็กซึ่งเราจะบอกว่าบูลีนที่ประพฤติตัวดี

โปรดทราบว่าสิ่งนี้ไม่ได้เน้นการดำเนินการแบบบิตตามที่คุณต้องการ0x1234 XNOR 0x5678 == 0xFFFFBBB3(สมมติว่าเป็น 32 บิต) เพื่อที่คุณจะต้องสร้างขึ้นจากการดำเนินงานอื่น ๆ ~(A^B)เช่น (หมายเหตุ: ~ไม่ใช่!)


6
ใน C, !ผู้ประกอบการสามารถใช้ในการแปลงintเป็นที่ 'มีความประพฤติดี' !a==!bbooleans:
ivan_pozdeev

2
@ivan_pozdeev และ!!(ที่สองตรรกะ "ไม่ได้" ผู้ประกอบการ) normalizes ค่าสเกลาใด ๆ กับหรือ0 1
Keith Thompson

5

XOR = A หรือ B แต่ไม่ใช่ A & B หรือไม่เท่ากัน (ไม่สามารถเท่ากับ [! =])
ดังนั้น XNOR จึงเป็นตัวเลือกที่แน่นอนและสามารถแทนค่าได้ง่ายด้วย == หรือ ===

อย่างไรก็ตามกรณีที่ไม่ใช่บูลีนทำให้เกิดปัญหาเช่นในตัวอย่างนี้:

a = 5
b = 1

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

ให้ใช้สิ่งนี้แทน:

a = 5
b = 1

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

หรือ

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

ตัวอย่างแรกจะคืนค่าเป็นเท็จ (5! = 1) แต่ค่าที่สองจะส่งคืนค่าของ true (a [value?] และ b [value?] ส่งคืนบูลีนเดียวกันคือ true (value = ไม่ใช่ 0 / มีค่า )

ตัวอย่าง alt เป็นเพียงประตูย้อนกลับ (a || b) &&! (a && b) (XOR)


3

ไม่จำเป็นต้องใช้ !(A^B)

แม้ว่าฉันคิดว่าคุณสามารถใช้ตัวดำเนินการมากเกินไปเพื่อสร้าง XNOR ของคุณเอง


1
นี่เป็นบิตไม่ใช่ตรรกะ
sll

ฉันคิดว่าผู้โพสต์รู้ดีว่าเมื่อเขารวมไว้ในคำถาม
Griffin

4
@sllev คุณเกือบจะมีฉันฉันต้องตรวจสอบอีกครั้ง ใน C # ^ เป็นตรรกะหากดำเนินการบนบูลีน หากดำเนินการในประเภทอินทิกรัลจะเป็นบิต โปรดดูmsdn.microsoft.com/en-us/library/zkacc7k1.aspx
trailmax

@trailmax: สิ่งดีๆขอบคุณที่ชี้ประเด็นนี้! รายละเอียดปีศาจจริงๆ!
sll

-6

คุณสามารถใช้===โอเปอเรเตอร์สำหรับ XNOR เพียงแค่คุณต้องแปลงaและbเป็นบูล

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

2
C # เท่านั้นที่ไม่มี===ตัวดำเนินการ
trailmax

คำตอบนี้ไม่ถูกต้อง===ตัวดำเนินการที่ไม่บีบบังคับคือจาวาสคริปต์และค่าสองเท่า!!ก่อนค่าในการประเมินผลไม่ถูกต้องใน c # เช่นกัน
Remi

ตามที่ระบุไว้แล้ว c # ไม่มีตัวดำเนินการที่มีเครื่องหมายเท่ากับสามตัว
Cramopy

=== ไม่ใช่ตัวดำเนินการใน C # ... (===) ใช้คือ JavaScript
Darkcoder
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.