~ x + ~ y == ~ (x + y) เป็นเท็จเสมอหรือไม่


153

รหัสนี้ประเมินว่าเป็นเท็จเสมอหรือไม่ ตัวแปรทั้งสองเป็นส่วนเสริมที่มีการลงนามของทั้งสอง

~x + ~y == ~(x + y)

ฉันรู้สึกว่าควรมีจำนวนที่ตรงกับเงื่อนไข ฉันลองทดสอบตัวเลขระหว่าง-5000และ5000ไม่เคยประสบความเท่าเทียมกัน มีวิธีการตั้งค่าสมการเพื่อหาคำตอบให้กับเงื่อนไขหรือไม่?

การสลับหนึ่งรายการสำหรับอีกรายการหนึ่งจะทำให้เกิดข้อบกพร่องที่ร้ายกาจในโปรแกรมของฉันหรือไม่


6
คุณต้องการพิสูจน์หรืออะไรซักอย่าง?
อัลวินหว่อง

26
โปรดทราบว่าในกรณีที่มีจำนวนเต็มล้นที่ลงนามแล้วมันเป็นพฤติกรรมที่ไม่ได้กำหนดทางเทคนิค ดังนั้นจึงเป็นไปได้ที่จะส่งคืนtrueแม้ว่าพวกเขาจะไม่สามารถสรุปได้ว่าส่วนประกอบสองอย่างที่เข้มงวด
Mysticial

1
@AlvinWong ใช่คำอธิบายจะดี
Steve

1
@Steve: คุณสามารถแสดงให้เห็นว่าคุณได้ลองผู้ต้องสงสัยทุกคนตามปกติแล้ว (-1, 0, 1, 2 และอื่น ๆ ) ในชุดค่าผสมทั้งหมดรวมทั้งความพยายามในการ "แก้ปัญหา" สำหรับคำขนาดเล็ก ( สามบิตสี่บิต) นั่นจะช่วยโน้มน้าวเราอย่างแน่นอนว่าเราไม่เพียง แต่ช่วยให้ใครบางคนได้รับสิ่งที่พวกเขาไม่ได้พยายามทำเพื่อตัวเองก่อน :)
sarnold

4
@AlexLockwood เมื่อฉันโพสต์คำถามเป็นครั้งแรกฉันคิดว่าการติดแท็กคำถามเป็น "การบ้าน" ขอให้ผู้คนให้คำใบ้เพื่อช่วยฉันแก้ปัญหา นั่นเป็นเหตุผลที่ฉันเพียงแค่ถามคำถามของปัญหาอย่างชัดเจน :)
Steve

คำตอบ:


237

สมมติว่ามีความขัดแย้งที่มีอยู่บางส่วนxและบางส่วนy(mod 2 n ) เช่นนั้น

~(x+y) == ~x + ~y

ด้วยส่วนประกอบสองอย่างเรารู้ว่า

      -x == ~x + 1
<==>  -1 == ~x + x

เมื่อสังเกตผลลัพธ์นี้เรามี

      ~(x+y) == ~x + ~y
<==>  ~(x+y) + (x+y) == ~x + ~y + (x+y)
<==>  ~(x+y) + (x+y) == (~x + x) + (~y + y)
<==>  ~(x+y) + (x+y) == -1 + -1
<==>  ~(x+y) + (x+y) == -2
<==>  -1 == -2

ดังนั้นความขัดแย้ง ดังนั้น~(x+y) != ~x + ~yสำหรับทั้งหมดxและy(mod 2 n )


* มันน่าสนใจที่จะทราบว่าในเครื่องที่มีเลขคณิตส่วนประกอบหนึ่งของความเท่าเทียมกันจริงถือเป็นจริงสำหรับทุกและx yนี่เป็นเพราะความสมบูรณ์ของคน, ~x = -x. ดังนั้น~x + ~y == -x + -y == -(x+y) == ~(x+y).


47
แน่นอน C ไม่ต้องการพฤติกรรมนี้ เนื่องจากไม่จำเป็นต้องใช้การแทนทั้งสองอย่าง
Billy ONeal

12
Btw ความเท่าเทียมกันนั้นเป็นจริงสำหรับความสมบูรณ์ การดำเนินการไม่ได้ไม่ได้กำหนดจริงๆสำหรับตัวเลขโดยทั่วไปดังนั้นการผสมไม่ได้กับผลลัพธ์เพิ่มเติมในพฤติกรรมที่แตกต่างกันขึ้นอยู่กับการแสดงตัวเลข
พฤศจิกายน

9
เราสามารถแก้ไขปัญหาให้เป็นจำนวนเต็มที่ไม่ได้ลงนามแล้วส่วนเติมเต็มสองครั้งก็ไม่ได้เล่นเลย
. GitHub หยุดช่วยน้ำแข็ง

5
เรียบง่ายยิ่งขึ้น IMHO: ~x == -(x+1)ดังนั้น~(x+y) == ~x + ~yนัย-(x+y+1) == -(x+1) + -(y+1)หมายถึง-1 == -2
BlueRaja - Danny Pflughoeft

7
@BillyONeal ไม่ต้องกังวลฉันแค่ล้อเล่นและฉันซาบซึ้งที่คุณพูดถึงมัน :) ฉันจะซื้อเครื่องดื่มให้คุณในวันที่ฉันพบเครื่องจักรที่ใช้เลขคณิตประกอบหนึ่งตัว ... เสียงนั้นเป็นยังไงบ้าง? ฮ่าฮ่า
อเล็กซ์ล็อควูด

113

ส่วนประกอบสองอย่าง

บนกว้างใหญ่ส่วนใหญ่ของคอมพิวเตอร์ถ้าxเป็นจำนวนเต็มแล้วจะแสดงเป็น-x ~x + 1อย่างเท่าเทียมกัน, ~x == -(x + 1). ทำให้ substution นี้ในสมการของคุณให้:

  • ~ x + ~ y == ~ (x + y)
  • - (x + 1) + - (y + 1) = - ((x + y) + 1)
  • -x - y - 2 = -x - y - 1
  • -2 = -1

ซึ่งเป็นความขัดแย้งเพื่อให้~x + ~y == ~(x + y)อยู่เสมอเท็จ


ที่กล่าวว่า pedants จะชี้ให้เห็นว่า C ไม่ต้องการส่วนประกอบสองอย่างดังนั้นเราจึงต้องพิจารณา ...

หนึ่งในองค์ประกอบ

ในส่วนประกอบหนึ่งของ , เป็นตัวแทนเพียงว่า-x ~xZero เป็นกรณีพิเศษที่มีทั้งการแสดงทั้งหมด -0 ( +0) และ all-1 ( -0) แต่ IIRC, C ต้องการ+0 == -0แม้ว่าพวกเขาจะมีรูปแบบบิตที่แตกต่างกันดังนั้นสิ่งนี้ไม่ควรเป็นปัญหา แทนเพียงแค่มี~-

  • ~ x + ~ y == ~ (x + y)
  • -x + (-y) = - (x + y)

ซึ่งเป็นความจริงทั้งหมดและxy


13
+1 สำหรับคำตอบที่จริง ๆ แล้วพิจารณาว่าทั้งสองส่วนประกอบและส่วนเติมเต็มหนึ่งบนพื้นดินเท่ากัน
CVn

13
@ +0 == -0dan04, ในที่สุดบางสิ่งที่สมเหตุสมผลใน C. :)
Alex Lockwood

32

พิจารณาเฉพาะบิตขวาสุดของทั้งสองxและy(IE. หากx == 13อยู่1101ในฐาน 2 เราจะดูเฉพาะบิตสุดท้าย a 1) จากนั้นมีกรณีที่เป็นไปได้สี่กรณี:

x = 0, y = 0:

LHS: ~ 0 + ~ 0 => 1 + 1 => 10
RHS: ~ (0 + 0) => ~ 0 => 1

x = 0, y = 1:

LHS: ~ 0 + ~ 1 => 1 + 0 => 1
RHS: ~ (0 + 1) => ~ 1 => 0

x = 1, y = 0:

ฉันจะปล่อยให้เรื่องนี้ขึ้นอยู่กับคุณตั้งแต่นี้เป็นการบ้าน (คำใบ้: มันเป็นเช่นเดียวกับก่อนหน้านี้กับ x และ y สลับกัน)

x = 1, y = 1:

ฉันจะปล่อยให้คนนี้ขึ้นอยู่กับคุณเช่นกัน

คุณสามารถแสดงให้เห็นว่าบิตที่ถูกต้องที่สุดจะแตกต่างกันไปทางด้านซ้ายมือและด้านขวามือของสมการที่ได้รับดังนั้นคุณได้พิสูจน์แล้วว่าทั้งสองข้างนั้นไม่เท่ากันเนื่องจากมีอย่างน้อยหนึ่งบิตที่พลิก จากกันและกัน.


27

หากจำนวนบิตเป็น n

~x = (2^n - 1) - x
~y = (2^n - 1) - y


~x + ~y = (2^n - 1) +(2^n - 1) - x - y =>  (2^n + (2^n - 1) - x - y ) - 1 => modulo: (2^n - 1) - x - y - 1.

ตอนนี้

 ~(x + y) = (2^n - 1) - (x + y) = (2^n - 1) - x - y.

ดังนั้นพวกเขาจะไม่เสมอกันโดยมีความแตกต่าง 1


4
@nhahtdh และคุณกำหนดวิธี~การดำเนินการเกี่ยวกับตัวเลขความกว้างไม่คงที่ได้อย่างไร
hamstergene

1
ฉันให้คำตอบนี้ด้วยจำนวนบิตเหล่านี้เพื่อให้ง่ายต่อการสัมพันธ์กับสิ่งที่สอนในชั้นเรียน โปรดทราบว่า ~ x ขึ้นอยู่กับจำนวนบิต n ที่ใช้เพื่อแทนจำนวน ดังนั้นจึงมีเหตุผลที่จะติดกับหนึ่งเมื่อพยายามตรวจสอบการทดลองนี้
Karthik Kumar Viswanathan

1
@hamstergene: ฉันรู้ว่าจำนวนบิตได้รับการแก้ไข แต่จุดของฉันคือว่ามันไม่จำเป็นต้องเป็นจำนวนเงินเหล่านั้น (8, 16, ฯลฯ )
พฤศจิกายน

1
สิ่งเหล่านี้คือค่าที่ง่ายต่อการเขียนโปรแกรมเพื่อตรวจสอบคำตอบ มันใช้งานได้กับ n ใด ๆ ตราบเท่าที่ ~ x และ ~ y ถูกเขียนเพื่อให้ตรงกับที่ให้ไว้
Karthik Kumar Viswanathan

1
@ hamstergene: ฉันไม่ได้มีปัญหากับการพิสูจน์เพียงว่าตัวเลขให้ความหมายเท็จว่ามันใช้ได้เฉพาะกับกรณีเหล่านั้น
พฤศจิกายน

27

คำแนะนำ:

x + ~x = -1(mod 2 n )

สมมติว่าเป้าหมายของคำถามคือการทดสอบทางคณิตศาสตร์ของคุณ (แทนที่จะเป็นทักษะการอ่าน - ซี - สเปคของคุณ) สิ่งนี้ควรนำคุณไปสู่คำตอบ


2
เฉพาะกับเครื่องเสริมสองเครื่องเท่านั้น (มาตรฐาน C ไม่ต้องการสิ่งนั้น)
Billy ONeal

12
@Billy: นั่นคือการพูดว่า "สำหรับคนสองคนเท่านั้น"
dan04

2
@ dan04: ไม่มันไม่ใช่ ฉันอยากจะบอกว่าขนาดที่เซ็นชื่อทั้งหมดและการเป็นตัวแทนขององค์ประกอบที่สมบูรณ์ได้หายไปจากโลกแล้ว แต่ฉันจะผิดที่บอกว่า มาตรฐาน C ไม่อนุญาตให้คุณตั้งสมมติฐานเช่นนั้น ดังนั้นฉันจะบอกว่ารหัสที่ทำให้สมมติฐานนั้นเป็นรหัสที่ไม่ดีส่วนใหญ่ (โดยเฉพาะอย่างยิ่งเมื่อมีวิธีที่ดีกว่าในการล้อเล่นกับตัวเลขที่ได้รับการเซ็นชื่อมากกว่า twiddling เล็กน้อยและโดยเฉพาะอย่างยิ่งเมื่อตัวเลขที่ไม่ได้ลงนามอาจเป็นตัวเลือกที่ดีกว่าส่วนใหญ่อยู่แล้ว)
Billy ONeal

10

ในส่วนประกอบของทั้งสองและ (และแม้แต่ในยุค 42) สิ่งนี้สามารถพิสูจน์ได้:

~x + ~y == ~(x + a) + ~(y - a)

ตอนนี้ให้a = yและเรามี:

~x + ~y == ~(x + y) + ~(y - y)

หรือ:

~x + ~y == ~(x + y) + ~0

ดังนั้นในสอง~0 = -1ข้อที่ว่าข้อเสนอนั้นเป็นเท็จ

ในส่วนที่ว่า~0 = 0ข้อเสนอนั้นเป็นความจริง


7

ตามหนังสือของ Dennis Ritchie, C ไม่ได้ใช้ส่วนประกอบสองอย่างเป็นค่าเริ่มต้น ดังนั้นคำถามของคุณอาจไม่เป็นจริงเสมอไป


5

ปล่อยให้MAX_INTเป็นตัวแทนโดย011111...111(สำหรับหลาย ๆ บิตมี) แล้วคุณจะรู้ว่า, ~x + x = MAX_INTและ~y + y = MAX_INTดังนั้นจึงคุณจะรู้ว่าสำหรับบางอย่างที่แตกต่างระหว่าง~x + ~yและเป็น~(x + y)1


5

C ไม่ต้องการให้ส่วนประกอบสองอย่างนั้นเป็นสิ่งที่ถูกนำไปใช้ อย่างไรก็ตามมีการใช้การล็อกที่คล้ายกันจำนวนเต็มที่ไม่ได้ลงนาม ความแตกต่างจะเป็น 1 ภายใต้ตรรกะนี้เสมอ!


3

แน่นอน C ไม่ต้องการพฤติกรรมนี้เพราะไม่จำเป็นต้องมีการแสดงส่วนประกอบสองอย่าง ตัวอย่างเช่น~x = (2^n - 1) - x& ~y = (2^n - 1) - yจะได้รับผลลัพธ์นี้


0

อ๊ะคณิตศาสตร์ไม่ต่อเนื่องขั้นพื้นฐาน!

ตรวจสอบกฎหมายของ De Morgan

~x & ~y == ~(x | y)

~x | ~y == ~(x & y)

สำคัญมากสำหรับการพิสูจน์บูลีน!


แค่ผิดธรรมดา ใน C + คือการเพิ่มการคูณ * และไม่ใช่บูลีนหรือหรือและ
nalply

ขอบคุณสำหรับการชี้ผู้ประกอบการที่ไม่ถูกต้อง ตอนนี้มันได้รับการอัพเดตด้วยตัวดำเนินการที่ถูกต้องแม้ว่าคุณจะถูกต้องแล้วก็ตามมันก็ไม่ได้ใช้กับคำถามเดิม
David Kaczynski

1
ถ้าจริงเป็นหนึ่งและเท็จเป็นศูนย์แล้ว + และ * ประพฤติตามหรือหรือและและยิ่งกว่านั้นส่วนประกอบสองของไม่เหมือนกันดังนั้นกฎหมายใช้บังคับอย่างไรก็ตาม
a1an

ขอบคุณสำหรับการชี้ให้เห็นว่า a1an ฉันพยายามคิดว่ากฎหมายของ De Morgan ยังคงสามารถนำไปใช้กับคำถามเดิมได้อย่างไร แต่ก็เป็นเวลาหลายปีแล้วที่ฉันศึกษา C Programming หรือ Discrete Mathematics
David Kaczynski
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.