~ x + ~ y == ~ (x + y) her zaman yanlış mıdır?


153

Bu kod her zaman yanlış olarak değerlendirilir mi? Her iki değişken de ikinin tamamlayıcı imzalı girişleridir.

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

Koşulları karşılayan bir sayı olması gerektiğini hissediyorum. Ben arasındaki sayılar test çalıştı -5000ve 5000ama asla elde eşitlik. Duruma çözüm bulmak için bir denklem kurmanın bir yolu var mı?

Birini diğeriyle değiştirmek programımda sinsi bir hataya neden olur mu?


6
Bir kanıt ya da bir şey ister misin?
Alvin Wong

26
İmzalı tamsayı taşması durumunda, bunun teknik olarak tanımlanmamış bir davranış olduğunu unutmayın. Bu yüzden true, asla katı ikisinin tamamlayıcısı olduğunu varsaymasalar bile geri dönmesi mümkündür .
Mistik

1
@AlvinWong evet bir açıklama güzel olurdu
Steve

1
@Steve: Tüm kombinasyonlarda olağan tüm şüphelileri (-1, 0, 1, 2 vb.) Ve küçük kelime boyutları sorununu "çözme" girişimlerinizi denediğinizi gösterebilirsiniz. üç bit? dört bit?). Bu kesinlikle birisinin önce kendileri için kazanmaya çalışmadığı bir şeyi almasına yardımcı olmadığımızı ikna etmemize yardımcı olur. :)
sarnold

4
@AlexLockwood Soruyu ilk kez gönderdiğimde, soruyu "ev ödevi" olarak etiketlediğimi varsaydım, insanlardan sorunu çözmeme yardımcı olacak ipuçları ("ödev" etiket durumlarının açıklaması olarak) ve sadece cevaplar vermemesini ister. Bu yüzden sorunun sorusunu açıkça sordum :)
Steve

Yanıtlar:


237

Çelişkili uğruna bazı xve bazılarının y(mod 2 n ) olduğu varsayın ki

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

İkisinin tamamlayıcısı * ile biliyoruz ki,

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

Bu sonuca dikkat çekerek,

      ~(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

Dolayısıyla bir çelişki. Bu nedenle, ~(x+y) != ~x + ~yherkes için xve y(mod 2 n ).


* Kişinin tamamlayıcı aritmetik bir makinede, eşitlik aslında tüm için de geçerli olduğunun nota ilginç xve y. Çünkü kişinin tamamlayıcısı altında ~x = -x. Böylece ~x + ~y == -x + -y == -(x+y) == ~(x+y),.


47
Elbette, C bu davranışı gerektirmez; çünkü ikisinin tamamlayıcı temsilini gerektirmez.
Billy ONeal

12
Ftw, eşitlik kişinin tamamlayıcısı için doğrudur . NOT işlemi genel olarak sayı için tam olarak tanımlanmamıştır, bu nedenle NOT ile karıştırmak sayının temsiline bağlı olarak farklı davranışlarla sonuçlanır.
nhahtdh

9
Biri sadece imzasız tamsayılar için sorun olabilir ve sonra iki tamamlayıcı hiç devreye girmez.
R .. GitHub BUZA YARDIMCI

5
Daha da basit, IMHO:, ~x == -(x+1)bu ~(x+y) == ~x + ~yima -(x+y+1) == -(x+1) + -(y+1)anlamına geliyor-1 == -2
BlueRaja - Danny Pflughoeft 20:12

7
@BillyONeal, endişelenme, sadece şaka yapıyordum ve bahsettiğiniz için minnettarım :). Size tamamlayıcı aritmetik yapan bir makine ile karşılaştığım gün bir içki alacağım ... bu kulağa nasıl geliyor? haha
Alex Lockwood

113

Ikisinin tamamlayıcısı

Açık engin eğer bilgisayarların çoğunda, xbir tam sayıdır, o -xolarak temsil edilir ~x + 1. Eşdeğer olarak ~x == -(x + 1). Denkleminizde bu sübstitüsyonun yapılması:

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

ki bu bir çelişkidir, bu yüzden ~x + ~y == ~(x + y)her zaman yanlıştır .


Bununla birlikte, şövalyeler C'nin iki tamamlayıcı gerektirmediğine işaret edecek, bu yüzden de düşünmeliyiz ...

Kişinin Tamamlayıcısı

Gelen kişinin tamamlayıcı , -xbasitçe olarak temsil edilir ~x. Sıfır, all-0 ( +0) ve all-1 ( -0) temsillerine sahip özel bir durumdur, ancak IIRC, C +0 == -0, farklı bit kalıplarına sahip olsalar bile gerektirir , bu nedenle bu bir sorun olmamalıdır. Sadece yerine ~sahip -.

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

ki bu herkes için geçerlidirx ve y.


13
Hem ikisinin hem de kişinin tamamlayıcısını eşit zeminde ele alan bir cevap için +1.
CVn

13
@ dan04 +0 == -0,. Sonunda C.'de mantıklı bir şey :)
Alex Lockwood

32

Sadece en sağdaki hem biraz düşünün xve y(IE eğer. x == 13Hangi 1101baz 2'de, sadece, son bit bir bakacağız 1Sonra dört olası durumlar vardır):

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:

Bu ev ödevi olduğu için bunu size bırakacağım (ipucu: x ve y ile değiştirilen öncekiyle aynı).

x = 1, y = 1:

Bunu size bırakacağım.

Herhangi bir olası girdi verildiğinde, denklemin en sağdaki bitinin Sol Tarafta ve Sağ Tarafta her zaman farklı olacağını gösterebilirsiniz. birbirinden.


27

Bit sayısı n ise

~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.

Şimdi,

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

Bu nedenle, her zaman eşitsiz olurlar, 1 farkla.


4
@nhahtdh ve ~sabit olmayan genişlik sayılarında işlemi nasıl tanımlıyorsunuz ?
hamstergene

1
Bu cevabı bu sayıda bitle verdim, böylece sınıflarda öğretilenlerle ilişkilendirmek kolay. ~ X değerinin sayıyı temsil etmek için kullanılan bit sayısına (n) büyük ölçüde bağlı olduğuna dikkat edin. Bu yüzden bunu deneysel olarak doğrulamaya çalışırken birine sadık kalmak mantıklı.
Karthik Kumar Viswanathan

1
@hamstergene: Bit sayısının sabit olduğunu biliyorum, ama amacım bu miktar (8, 16, vb.) olması gerekmiyor.
nhahtdh

1
Bunlar, cevabı doğrulamak için bir program yazmanın kolay olduğu değerlerdir. ~ X ve ~ y değerleri verilene uygun olarak yazıldığı sürece herhangi bir n için çalışır.
Karthik Kumar Viswanathan

1
@hamstergene: Kanıtla ilgili bir sorunum yok, sadece sayılar sadece bu vakalar için işe yaradığına dair yanlış bir sonuç veriyor.
nhahtdh

27

İpucu:

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

Sorunun amacının matematiğinizi test etmek olduğunu varsayarsak (C-spesifikasyon becerilerinizden ziyade), bu size cevap verecektir.


2
Sadece ikisinin tamamlayıcı makinelerinde. (C standardı bunu gerektirmez)
Billy ONeal

12
@Billy: Bu "sadece iki silahlı insanlar için" demek gibi.
dan04

2
@ dan04: Hayır, değil. İmzalı tüm büyüklükleri ve tamamlayıcıları temsil edenlerin dünyadan gittiğini söylemek isterim. Ama bunu söylerken yanlış olurdum. C standardı bu varsayımı yapmanıza izin vermez; bu nedenle bu varsayımı kötü kod yapan kod çoğu zaman söyleyebilirim. (Özellikle işaretli numaralarla uğraşmaktan biraz daha iyi yollar olduğunda ve özellikle imzasız numaralar muhtemelen çoğu zaman daha iyi bir seçim olduğunda)
Billy ONeal

10

Hem bir hem de iki (ve 42'li yıllarda) tamamlayıcıda, bu kanıtlanabilir:

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

Şimdi izin ver a = yve elimizde:

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

veya:

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

Bu nedenle, ikisinin tamamlayıcısında ~0 = -1, teklif yanlıştır.

Birinin tamamlayıcısı olarak ~0 = 0, öneri doğrudur.


7

Dennis Ritchie'nin kitabına göre, C varsayılan olarak ikisinin tamamlayıcısını uygulamıyor. Bu nedenle, sorunuz her zaman doğru olmayabilir.


5

Izin MAX_INTvermek int temsil olmak 011111...111(ancak birçok bit vardır). Sonra bunu biliyor, ~x + x = MAX_INTve ~y + y = MAX_INTböylece bu nedenle arasındaki fark kesin olarak bilecek, ~x + ~yve ~(x + y)olduğunu 1.


5

C, ikisinin tamamlayıcısının uygulanan şey olmasını gerektirmez. Ancak, imzasız tam sayı için benzer mantıklar uygulanır. Farklar her zaman bu mantık altında 1 olacaktır!


3

Elbette, C bu davranışı gerektirmez, çünkü ikisinin tamamlayıcı gösterimini gerektirmez. Örneğin, ~x = (2^n - 1) - x& ~y = (2^n - 1) - ybu sonucu alır.


0

Ah, temel ayrık matematik!

Check out De Morgan Kanunu

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

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

Boole kanıtları için çok önemli!


Sadece yanlış. C + 'da toplama, * çarpma ve boole veya veya ve değil.
nalply

Yanlış operatörleri işaret ettiğiniz için teşekkür ederiz. Orijinal soruya uygulanmadığı için doğru olmanıza rağmen, şimdi doğru operatörlerle güncellenmiştir.
David Kaczynski

1
Eğer doğruysa bir doğruysa ve yanlış sıfırsa, + ve * aynen ya da gibi davranırlar ve ayrıca ikisinin tamamlayıcısı da öyle davranmaz, bu nedenle yasa geçerlidir.
a1an

Bunu gösterdiğin için teşekkürler a1an. De Morgan Yasalarının hala orijinal soruya nasıl uygulanabileceğini düşünmeye çalışıyordum, ancak C programlama veya Ayrık Matematik okuduğumdan bu yana birkaç yıl geçti.
David Kaczynski
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.