“2'nin Tamamlayıcısı” nedir?


434

Bir bilgisayar sistemleri dersindeyim ve kısmen Two's Complement ile mücadele ediyorum . Anlamak istiyorum ama okuduğum her şey resmi benim için bir araya getirmedi. Wikipedia makalesini ve ders kitabım da dahil olmak üzere çeşitli diğer makaleleri okudum .

Bu nedenle, Two's Complement'in ne olduğunu, nasıl kullanılacağını ve dökümler (imzalıdan imzasıza ve tersi gibi) operasyonlar sırasında sayıları nasıl etkileyebileceğini tanımlamak için bu topluluk wiki postasını başlatmak istedim. .

Umduğum şey, bir programcı tarafından kolayca anlaşılabilen net ve özlü bir tanımdır .

Yanıtlar:


627

Two'nun tamamlayıcısı, tam sayıları depolamanın akıllı bir yoludur, böylece ortak matematik problemlerinin uygulanması çok basittir.

Anlamak için, ikili sayıları düşünmelisiniz.

Temelde diyor ki,

  • sıfır için 0'ların tümünü kullanın.
  • pozitif tamsayılar için en fazla 2 (bit sayısı - 1) -1 ile saymaya başlayın .
  • negatif tamsayılar için, tam olarak aynı şeyi yapın, ancak 0'ların ve 1'lerin rolünü değiştirin (yani 0000 ile başlamak yerine 1111 ile başlayın - bu "tamamlayıcı" kısımdır).

4 bitlik bir mini bayt ile deneyelim (buna bir kırıntı - 1/2 bayt deriz ).

  • 0000 - sıfır
  • 0001 - bir
  • 0010 - iki
  • 0011 - üç
  • 0100için 0111- 06:56

Olumlu yönde gidebildiğimiz kadarıyla bu. 2 3 -1 = 7.

Negatifler için:

  • 1111 - negatif olan
  • 1110 - negatif iki
  • 1101 - negatif üç
  • 1100için 1000- negatif sekiz negatif dört

Pozitifler için olmayan negatifler ( 1000= -8) için bir ekstra değer elde edeceğinizi unutmayın. Çünkü 0000sıfır için kullanılır. Bu bilgisayarların Sayı Hattı olarak düşünülebilir .

Pozitif ve negatif sayılar arasında ayrım yapma

Bunu yaparak, ilk bit negatif ve negatif ondalık değerleri ayırmak için kullanılabileceğinden "işaret" bitinin rolünü alır. En anlamlı bit ise 1, ikilikin negatif olduğu söylenebilir, burada en önemli bit (en soldaki) sanki 0ondalık değerin negatif olmadığını söyleyebilirsiniz.

"Kişinin tamamlayıcısı" negatif sayılar sadece işaret bitini döndürür, sonra 0'dan sayılır. Ancak bu yaklaşım 1000kafa karıştırıcı olan "negatif sıfır" olarak yorumlamakla uğraşmak zorundadır . Bu konuda genellikle yalnızca donanıma yakın çalışırken endişelenmeniz gerekir.


147
Muhtemelen ikisinin tamamlayıcının en iyi yanı, matematiği nasıl basitleştirdiği. Birlikte 2 (0010) ve -2 (1110) eklemeyi deneyin ve 10000 elde edersiniz. En önemli bit
taşmadır

96
Kolay toplama ve çıkarma yanında bir diğer avantaj, 2s tamamlayıcının sadece bir sıfıra sahip olmasıdır. Basit bir işaret biti kullanıyorsanız, diyelim ki +1'yi temsil etmek için 0001'i ve -1'i temsil etmek için 1001'i kullanırsanız, iki sıfırınız olur: 0000 ("+0") ve 1000 ("-0"). Bu arkada gerçek bir acı.
Jörg W Mittag

26
Bu noktaya gelmek ve negatif değerlerin neden pozitif olanları daha geniş bir aralığa sahip olduğunu açıklamak için oy verin. Menzil farkının nedenini aramaya geldim.
Ashwin

2
"Negatif tamsayılar için, tam olarak aynı şeyi yapın ama geri sayım yapın ve
Koray Tugay

1
Harika. Bitleri negatif tamsayıya dönüştürmenin ekstra parçaları eklendi.
Suraj Jain

339

Wikipedia makalesinden daha iyi açıklanıp açıklanamayacağını merak ediyorum.

İkisinin tamamlayıcı gösterimi ile çözmeye çalıştığınız temel problem negatif tamsayıları saklama problemidir.

İlk olarak 4 bitte saklanan işaretsiz bir tamsayıyı düşünün. Aşağıdakilere sahip olabilirsiniz

0000 = 0
0001 = 1
0010 = 2
...
1111 = 15

Bunlar imzasızdır, çünkü negatif veya pozitif olduklarına dair bir gösterge yoktur.

İşaret Büyüklüğü ve Fazla Gösterim

Negatif sayıları saklamak için birkaç şeyi deneyebilirsiniz. İlk olarak, ilk biti +/- değerini göstermek için işaret biti olarak ve kalan biti büyüklüğü göstermek için işaret biti gösterimini kullanabilirsiniz. Yani tekrar 4 bit kullanmak ve 1'in - ve 0'ın + demek olduğunu varsayarsak,

0000 = +0
0001 = +1
0010 = +2
...
1000 = -0
1001 = -1
1111 = -7

Yani, problemi orada görüyor musunuz? Pozitif ve negatif 0'ımız var. En büyük sorun ikili sayıları toplamak ve çıkartmaktır. İşaret büyüklüğünü kullanarak toplama ve çıkarma devreleri çok karmaşık olacaktır.

Nedir

0010
1001 +
----

?

Başka bir sistem fazla gösterimdir . Negatif sayıları saklayabilirsiniz, iki sıfır sorunundan kurtulursunuz, ancak toplama ve çıkarma zor kalır.

Yani ikisinin tamamlayıcısı geliyor. Artık pozitif ve negatif tamsayıları kaydedebilir ve aritmetiği nispeten kolaylıkla gerçekleştirebilirsiniz. Bir sayıyı ikinin tamamlayıcısına dönüştürmek için birkaç yöntem vardır. Işte bir tane.

Ondalık Sayı'yı İkinin Tamamlayıcısına Dönüştür

  1. Sayıyı ikilik biçime dönüştür (şimdilik işareti yoksay) örneğin 5 0101 ve -5 0101

  2. Sayı pozitif bir sayıysa, işiniz bitmiştir. örneğin 5, ikiye tamamlayıcı gösterimi kullanılarak ikili dosyada 0101'dir.

  3. Sayı negatifse,

    3.1 tamamlayıcıyı bulun (0'ları ve 1'leri ters çevirin) örn. -5 0101'dir, bu yüzden tamamlayıcıyı bulmak 1010'dur

    3.2 1010 + 1 = 1011 tamamlayıcısına 1 ekleyin. Bu nedenle, ikisinin tamamlayıcısında -5 1011'dir.

Peki, ikilide 2 + (-3) yapmak isteseydiniz ne olurdu? 2 + (-3) -1'dir. Bu sayıları eklemek için işaret büyüklüğü kullanıyorsanız ne yapardınız? 0010 + 1101 =?

İkisinin tamamlayıcısını kullanarak ne kadar kolay olacağını düşünün.

 2  =  0010
 -3 =  1101 +
 -------------
 -1 =  1111

Two's Complement'i Ondalık Sayıya Dönüştürme

1111'i ondalığa dönüştürme:

  1. Sayı 1 ile başlar, bu yüzden negatiftir, bu yüzden 0000'ın 1111'in tamamlayıcısını buluyoruz.

  2. 0000'a 1 ekleyin ve 0001 elde ederiz.

  3. 0001'i ondalık sayıya dönüştürün, bu da 1'dir.

  4. = -1 işaretini uygulayın.

Tada!


45
Bence en iyi cevap.
Koray Tugay

5
evet, bu oldukça basit ve konuyu çok iyi açıklıyor
Max Koretskyi

3
Her iki yolu da dönüştürürken bir eklemenin her zaman aynı sayıya nasıl yol açtığını anlamıyorum. Aklımda adımları tersine çevirir ya da birini ya da bir şeyi çıkarırsınız.
Marcos Pereira

2
Tamamlayıcıya neden 1 ekleyelim?
Zinan Xing

4
Bu cevap Wikipedia'da kullanılmalıdır.
Hiroki

119

Ben gördüğüm en açıklamalardan gibi, yukarıda olanlar 2'nin tamamlayıcı ile çalışma hakkında açık ve net ama gerçekten ne anlatmak değil vardır matematiksel olarak. Bunu en azından tamsayılar için yapmaya çalışacağım ve muhtemelen önce tanıdık olan bir arka plan ele alacağım.

Ondalık için nasıl çalıştığını hatırlayın:
  2345
,
  2 × 10 3 + 3 × 10 2 + 4 × 10 1 + 5 × 10 0 yazmanın bir yoludur .

Aynı şekilde, ikili, aynı genel fikri izleyerek sadece 0 ve 1 kullanarak sayı yazmanın bir yoludur , ancak yukarıdaki 10'ları 2'lerle değiştirir. Sonra ikili,
  1111
,
  1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0 yazmanın bir yoludur
ve eğer çalışırsanız, bu 15'e eşittir (taban 10). Çünkü
  8 + 4 + 2 + 1 = 15.

Her şey iyi ve pozitif sayılar için iyi. İnsanların ondalık sayılarla yaptığı gibi, önlerine bir eksi işareti yapıştırmak istiyorsanız, negatif sayılar için bile çalışır. Bu bilgisayarlarda bile yapılabilir, ancak 1970'lerin başından beri böyle bir bilgisayar görmedim. Farklı bir tartışmanın nedenlerini bırakacağım.

Bilgisayarlar için negatif sayılar için bir tamamlayıcı gösterim kullanmak daha verimli olur . Ve işte çoğu zaman gözden kaçan bir şey. Tamamlayıcı gösterimler, sayının basamaklarının bir tür tersine çevrilmesini, hatta normal bir pozitif sayıdan önce gelen zımni sıfırları içerir. Bu garip, çünkü soru ortaya çıkıyor: hepsi mi? Dikkate alınması gereken sonsuz sayıda basamak olabilir.

Neyse ki, bilgisayarlar sonsuzluğu temsil etmiyor. Sayılar belirli bir uzunlukla sınırlıdır (veya isterseniz genişlikle). Öyleyse pozitif ikili sayılara dönelim, ancak belirli bir boyutta. Bu örnekler için 8 basamak ("bit") kullanacağım. Yani ikili sayımız gerçekten
  00001111
veya
  0 × 2 7 + 0 × 2 6 + 0 × 2 5 + 0 × 2 4 + 1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0

2'nin tamamlayıcı negatifini oluşturmak için, önce tüm (ikili) rakamları
  11110000 oluşturmak için tamamlar
ve 11110001'i oluşturmak için 1
  ekleriz,
ancak bunu -15 anlamına nasıl anlarız?

Cevap, yüksek dereceli bitin (en soldaki) anlamını değiştirmemizdir. Bu bit, tüm negatif sayılar için 1 olacaktır . Değişiklik, görünen numarayı değerine katkısının işaretini değiştirmek olacaktır Yani şimdi bizim. 11110001 temsil ettiği anlaşılmaktadır
  - 1 × 2 7 + 1 × 2 6 + 1 × 2 5 + 1 × 2 4 + 0 × 2 3 + 0 × 2 2 + 0 × 2 1 + 1 × 2 0
Bu ifadenin önünde "-" olduğuna dikkat edin? İşaret bitinin -2 -7 , yani -128 (taban 10) ağırlığını taşıdığı anlamına gelir . Diğer tüm pozisyonlar işaretsiz ikili sayılardaki ağırlıklarını korurlar.

-15 ile çalışırken,
  -128 + 64 + 32 + 16 + 1
hesap makinenizde deneyin. -15.

Bilgisayarlarda temsil edilen negatif sayıları gördüğüm üç ana yoldan, 2'nin tamamlayıcısı genel kullanım kolaylığı için eller kazanır. Yine de tuhaflığı var. İkili olduğu için, çift sayıda olası bit kombinasyonu olmalıdır. Her pozitif sayı negatif ile eşleştirilebilir, ancak yalnızca bir sıfır vardır. Bir sıfırı reddetmek sıfırı alır. Yani bir daha kombinasyonu ile numara var 1 işaret biti ve 0 başka her yerde. Karşılık gelen pozitif sayı, kullanılan bit sayısına uymayacaktır.

Bu sayı hakkında daha da garip olan şey, bir tamamlayıcıyı ekleyerek pozitif oluşturmaya çalışırsanız, aynı negatif sayıyı geri alırsınız. Sıfırın bunu yapması doğal görünmektedir, ancak bu beklenmedik bir durumdur ve alıştığımız davranış hiç de değildir, çünkü bilgisayarlar bir yana, genellikle bu sabit uzunluklu aritmetik değil, sınırsız sayıda rakam kaynağı düşünüyoruz.

Bu tuhaflıkların bir buzdağının ucu gibidir. Yüzeyin altında daha fazla beklemek var, ama bu tartışma için bu yeterli. Eğer sabit nokta aritmetiği için "taşma" araştırırsanız muhtemelen daha fazla bulabilirsiniz. Gerçekten içine girmek istiyorsanız, "modüler aritmetik" de araştırma yapabilirsiniz.


1
Bu cevabı beğendim! 2'lerin alınmasının nasıl tamamlandığını ve nasıl eklendiğini açıklar.
SJ.

Bu yanıtı da seviyorum. Özellikle negatif sayının nasıl hesaplandığını gösterir. Burada sadece MSB değil, tüm sayının ters çevrildiğini düşündüm ve daha sonra diğer ağırlıklı değerleri geri ekledim. Teşekkür ederim, bu beyin
bloğumu

Tersi olmayan garipbol numarasından bahsetmek iyi iş. Peki bu konuda ne yapacağız? Birisi ters çevirmeye çalışırsa taşma bayrağını mı ayarlıyoruz?
NH.

Diğer cevaplar "nasıl" üzerine odaklanırken, bu cevap bizi nazikçe "neden" ile yönlendiriyor. Bana yardımcı oldu. Teşekkürler!
Abhishek Pathak

Bir sayı 11000 ... 000 ile biterse, tersine çevirme 01000 ... 000 verir. İkisinin tamamlayıcı gösterimi, en solda temsil edilen basamağın solundaki tüm rakamların bu rakamla aynı değere sahip olması gerektiği fikrine dayanır, ancak temsili 1000 ... 000 olan bir sayıyı ters çevirirken bu doğru olmaz.
supercat

20

2'nin tamamlayıcısı bir ikilinin değerini bulmak için çok yararlıdır, ancak böyle bir sorunu çözmenin çok daha özlü bir yolunu düşündüm (başka kimsenin yayınladığını görmedim):

örneğin, bir ikili alır: 1101 e eşit [bu alanı "1" varsayılarak işaretidir] -3 .

2 'nin tamamlayıcısını kullanarak bunu yapardık ... 1101'den 0010'a çevir ... 0001 + 0010 === ekleyin> 0011. 0011'i pozitif ikili olarak verir = 3. bu nedenle 1101 = -3 !

Ne farkettim:

tüm saygısız ve ekleme yerine, pozitif bir ikili (0101 diyelim) için çözme için temel yöntemi yapabilirsiniz (2 3 * 0) + (2 2 * 1) + (2 1 * 0) + (2 0 * 1) = 5.

Aynı konsepti bir negatif ile yapın! (Küçük bir bükülme ile)

1101'i alın, örneğin:

2 3 * 1 = 8 yerine ilk sayı için - (2 3 * 1) = -8 yapın .

sonra her zamanki gibi devam edin, -8 + (2 2 * 1) + (2 1 * 0) + (2 0 * 1) = -3


1
En iyi yol, ben 2 tamamlayıcı anlayabiliyordu. Bunu okuduktan sonra, yukarıdaki sorunun tüm cevaplarını anlayabiliyordum.
Shakeel Shahzad

1
Bu yöntem Bilgisayar Sistemleri: Bir programcının bakış açısıyla anlatılmıştır.
jimo

1
Bu çok daha hızlı bir yol!
chanzerre

14

Sınırlı sayıda bit / trit / basamak / her neyse olduğunu düşünün. 0'ı tüm basamaklar 0 olarak tanımlar ve doğal olarak yukarı doğru sayarsınız:

00
01
02
..

Sonunda taşacaksın.

98
99
00

İki rakamımız var ve 0 ile 100 arasındaki tüm sayıları temsil edebilir. Tüm bu sayılar pozitif! Diyelim ki negatif sayıları da temsil etmek istiyoruz?

Gerçekten sahip olduğumuz şey bir döngü. 2'den önceki sayı 1'dir. 1'den önceki sayı 0'dır. 0'dan önceki sayı ... 99'dur .

Yani, basitlik için, diyelim ki 50'nin üzerindeki herhangi bir sayı negatiftir. "0" ila "49", 0 ila 49'u temsil eder. "99", -1'dir, "98", -2'dir ... "50", -50'dir.

Bu temsil onlarca tamamlayıcıdır . Bilgisayarlar tipik olarak rakam yerine bit kullanmak dışında aynı olan iki tamamlayıcı kullanır.

Onlarýn tamamlayýcýsýyla ilgili güzel bir ţey, katýlýmýn iţe yaramasý . Pozitif ve negatif sayılar eklemek için özel bir şey yapmanıza gerek yoktur!


9

Kilometre sayacını bir benzetme olarak kullanarak jng ile Reddit hakkında harika bir açıklama okudum .

resim açıklamasını buraya girin

Yararlı bir sözleşmedir. İkili sayıya pozitif sayılar ekleyen / çıkarabilen aynı devreler ve mantık işlemleri, eğer konvansiyonu kullanıyorsanız, hem pozitif hem de negatif sayılar üzerinde hala çalışır, bu yüzden çok kullanışlı ve her yerde mevcut.

Bir arabanın kilometre sayacını düşünün, 99999'da yuvarlanır. 00000'ü arttırırsanız 00001 alırsınız. 00000'ü düşürürseniz, 99999'u alırsınız (yuvarlanma nedeniyle). 99999'a bir tane eklerseniz, 00000'e geri döner. Bu nedenle 99999'un -1'i temsil ettiğine karar vermek yararlıdır. Benzer şekilde, 99998'in -2'yi temsil ettiğine karar vermek çok yararlıdır, vb. Bir yerde durmalısınız ve ayrıca konvansiyonla, sayıların üst yarısının negatif olduğu kabul edilir (50000-99999) ve alt yarısının pozitifi sadece kendileri içindir (00000-49999). Sonuç olarak, üst basamağın 5-9 olması, temsil edilen sayının negatif olduğu ve 0-4 olması, temsil edilenin pozitif olduğu anlamına gelir - ikisinin tamamlayıcı ikili sayısındaki işareti temsil eden üst bit ile tam olarak aynıdır.

Bunu anlamak benim için de zordu. Bir kez anladım ve kitap makalelerini ve açıklamalarını tekrar okumak için geri döndüm (o zamanlar internet yoktu), bunu gerçekten anlamadığını açıklayanların birçoğu ortaya çıktı. Bundan sonra (10 yıl boyunca oldukça iyi satan) bir montaj öğretimi dili yazdım.


5

Verilen sayının 1'inci tamamlayıcısına bir tane eklenerek iki tamamlayıcı bulunmuştur. Biz tamamlayacak ikişer ikişer öğrenmek zorunda Sağlar ki 10101, daha sonra onun olanları tamamlayacak bulmak 01010eklemek 1, bu sonuç için 01010+1=01011, son kararım olan.


4

8 - 12 biti kullanarak 10 - 12 yanıtını ikili biçimde alalım: Gerçekten yapacağımız şey 10 + (-12)

İkili 10'dan çıkartmak için 12'nin iltifat kısmını almalıyız. İkilide 12, 00001100'dür. İkilide 10, 00001010'dur.

12'nin iltifat kısmını elde etmek için tüm bitleri tersine çeviririz ve tersine ikili 12'de 11110011'dir. Bu aynı zamanda Ters koddur (tamamlayıcı). Şimdi bir tane eklememiz gerekiyor, şimdi 11110100.

Yani 11110100, 12'nin iltifatıdır! Bu şekilde düşündüğünüzde kolay.

Şimdi yukarıdaki soruyu 10-12 ikili biçimde çözebilirsiniz.

00001010
11110100
-----------------
11111110  

3

2'nin Tamamlayıcıları: Bir sayının 1'in tamamlayıcıları ile fazladan bir tane eklediğimizde, 2'nin tamamlayıcılarını alırız. Örneğin: 100101, 1'in tamamlayıcısı 011010 ve 2'nin tamamlayıcısı 011010 + 1 = 011011'dir (1'in tamamlayıcısı olan birini ekleyerek) Daha fazla bilgi için bu makale grafiksel olarak açıklar.


ile bir açıklama olan link için plus1
Manohar Reddy Poreddy

3

İkisinin tamamlayıcı sistemine matematik açısından bakmak gerçekten mantıklı. Onlarýn tamamlayýcýsýndaki fikir, farký esasen 'izole etmek'.

Örnek: 63-24 = x

Gerçekten sadece (100 - 24) olan 24'ün tamamlayıcısını ekliyoruz. Gerçekten, yaptığımız tek şey denklemin her iki tarafına 100 eklemek.

Şimdi denklem: 100 + 63 - 24 = x + 100, bu yüzden 100'ü (veya 10 veya 1000 veya her neyse) kaldırıyoruz.

Uzun bir sıfır zincirinden bir sayı çıkarmak zorunda kalmanın elverişsiz durumu nedeniyle, ondalık sistemde dokuzun tamamlayıcısı olan bir 'azalan sayı tabanı tamamlayıcısı' sistemi kullanıyoruz.

Büyük bir dokuz zincirden çıkarılan bir sayı bize sunulduğunda, sadece sayıları tersine çevirmemiz gerekir.

Örnek: 99999-03275 = 96724

Bu nedenle, dokuz tamamlayıcıdan sonra 1 ekliyoruz. Muhtemelen çocukluk matematiğinden bildiğiniz gibi, 9 'çalarak' 10 olur. Yani temelde farkın 1'ini alan sadece onun tamamlayıcısıdır.

İkili'de, ikisinin tamamlayıcısı, onun tamamlayıcısı ile eşitken, bir kısmı tamamlayıcısı dokuz tamamlayıcısıdır. Birincil fark, farkı on kuvvetle izole etmeye çalışmak yerine (denkleme 10, 100, vb. Ekleyerek) farkı iki kuvvetle izole etmeye çalışmaktır.

Bu nedenle bitleri tersine çeviriyoruz. Bizim minuendimizin ondalık bir dokuzluk zinciri gibi, minuendimiz de ikili olan bir zincirdir.

Örnek: 111111-101001 = 010110

Zincirleri iki güzel gücün 1 altında olduğundan, ondalık onda dokuz gibi yapmaktan 1 çalıyorlar.

Negatif ikili sayıları kullanırken, gerçekten sadece şunu söylüyoruz:

0000 - 0101 = x

1111-0101 = 1010

1111 + 0000-0101 = x + 1111

X'i 'izole etmek' için 1 eklememiz gerekir, çünkü 1111 10000'den bir tane uzaktır ve baştaki 1'i kaldırırız çünkü orijinal farkına ekledik.

1111 + 1 + 0000-0101 = x + 1111 + 1

10000 + 0000-0101 = x + 10000

Sadece x almak için her iki taraftan 10000 çıkarın, bu temel cebir.


3

Şimdiye kadar cevapların çoğu, ikisinin tamamlayıcısının negatif sayıyı temsil etmek için neden kullanıldığını güzelce açıklıyor, ancak bize ikisinin tamamlayıcı sayısının ne olduğunu, özellikle de '1'in neden eklendiğini ve aslında yanlış bir şekilde eklendiğini söylemiyor.

Karışıklık, tamamlayıcı bir sayının tanımının yetersiz anlaşılmasından kaynaklanmaktadır. Tamamlayıcı bir şeyi tamamlayacak eksik kısımdır.

B tabanındaki n basamaklı sayı x'in sayı tabanı tamamlayıcısı, tanım gereği, b ^ nx'dir. İkili 4'te 3 rakam (n = 3) ve 2 yarıçapı (b = 2) olan 100 gösterilir. Böylece sayı tabanı tamamlayıcısı b ^ nx = 2 ^ 3-4 = 8-4 = 4'tür (veya ikili dosyada 100).

Bununla birlikte, ikilikte bir sayı tabanı tamamlayıcısının elde edilmesi, (b ^ n-1) -y olarak tanımlanan azalan sayı tabanı tamamlayıcısını elde etmek kadar kolay değildir, sayı tabanı tamamlayıcısıdakinden sadece 1 daha azdır. Azalan bir radix tamamlayıcısı elde etmek için tüm rakamları çevirmeniz yeterlidir.

100 -> 011 (azalmış (kişi) sayı tabanı tamamlayıcısı)

sayı tabanı (iki) tamamlayıcısı elde etmek için, tanım olarak tanımlandığı gibi basitçe 1 ekleriz.

011 +1 -> 100 (ikisinin tamamlayıcısı).

Şimdi bu yeni anlayışla, Vincent Ramdhanie tarafından verilen örneğe bakalım (yukarıdaki ikinci cevaba bakınız)

/ * Vincent'ın başlangıcı

1111'i ondalığa dönüştürme:

Sayı 1 ile başlar, bu yüzden negatiftir, bu yüzden 0000 olan 1111'in tamamlayıcısını buluruz. 1'den 0000'a ekleriz ve 0001'i elde ederiz. 0001'i ondalık sayıya dönüştürün, bu da 1'dir. İşareti uygulayın = -1. Tada!

Vincent'ın sonu * /

Olarak anlaşılmalıdır

Sayı 1 ile başlar, bu yüzden negatiftir. Yani biliyoruz ki ikisinin x değerini tamamlaması. İkisinin tamamlayıcısı tarafından temsil edilen x'i bulmak için, önce onun tamamlayıcısını bulmamız gerekir.

ikisinin x tamamlayıcısı: 1111 kişinin tamamlayıcısı x: 1111-1 -> 1110; x = 0001, (tüm rakamları çevir)

- işaretini ve yanıtı = -x = -1 uygulayın.


3

Tamamlayıcı kelimesi bütünlükten türemiştir. Ondalık dünyada 0 ile 9 arasındaki sayılar, tüm ondalık sayıları ifade etmek için bir sayı veya tam sayı simgesi tamamlayıcısı sağlar . İkili dünyada 0 ve 1 sayıları, tüm ikili sayıları ifade etmek için sayıları tamamlar . Aslında 0 ve 1 sembolleri, pozitif (0) ve negatif (1) yanı sıra her şeyi (metin, resim vb.) Temsil etmek için kullanılmalıdır. Dünyamızda sayının solundaki boşluk sıfır olarak kabul edilir:

                  35=035=000000035.

Bilgisayar depolama konumunda boş alan yok. Tüm bitler (ikili basamaklar) 0 veya 1 olmalıdır. Verileri verimli bir şekilde kullanmak için 8 bit, 16 bit, 32 bit, 64 bit, 128 bit gösterim olarak saklanabilir. 8 bitlik bir sayı olarak saklanan bir sayı 16 bitlik bir yere aktarıldığında işaret ve büyüklük (mutlak değer) aynı kalmalıdır. Hem 1'in hem de 2'nin tamamlayıcı gösterimleri bunu kolaylaştırır. Bir isim olarak: Hem 1'in hem de 2'nin tamamlayıcısı, en önemli bitin (soldaki) işaret biti olduğu imzalı miktarların ikili gösterimleridir. 0 pozitif, 1 negatif içindir. 2s tamamlayıcısı negatif anlamına gelmez. İmzalı bir miktar anlamına gelir. Ondalık olarak olduğu gibi, büyüklük pozitif miktar olarak temsil edilir. Yapı, daha fazla bit içeren bir sicile [] yükseltilirken miktarı korumak için işaret uzantısı kullanır:

       [0101]=[00101]=[00000000000101]=5 (base 10)
       [1011]=[11011]=[11111111111011]=-5(base 10)

Bir fiil olarak: 2'nin tamamlayıcısı , reddetmek anlamına gelir . Negatif yapmak demek değildir. Negatif pozitif yaparsa; eğer pozitifse negatif yapın. Büyüklük mutlak değerdir:

        if a >= 0 then |a| = a
        if a < 0 then |a| = -a = 2scomplement of a

Bu yetenek, negate sonra add kullanarak verimli ikili çıkarma sağlar. a - b = a + (-b)

1'in tamamlayıcısını almanın resmi yolu, her basamak için değerini 1'den çıkarmaktır.

        1'scomp(0101) = 1010.

Bu, her bir bitin ayrı ayrı çevrilmesi veya ters çevrilmesi ile aynıdır. Bu, iyi sevilmeyen negatif bir sıfır ile sonuçlanır, bu nedenle te 1'in tamamlayıcısına bir tane eklemek problemden kurtulur. 2s tamamlayıcısını reddetmek veya almak için önce 1s tamamlayıcısını alın, sonra 1 ekleyin.

        Example 1                             Example 2
         0101  --original number              1101
         1's comp  1010                       0010
         add 1     0001                       0001
         2's comp  1011  --negated number     0011

Örneklerde, olumsuzlama genişletilmiş sayılarla da çalışır.

Ekleme:
1110 Taşıma 111110 Taşıma 0110, 000110 1111 111111 toplamı 0101 toplamı 000101 ile aynıdır

çıkarılarak:

    1110  Carry                      00000   Carry
     0110          is the same as     00110
    -0111                            +11001
  ----------                        ----------
sum  0101                       sum   11111

2'nin tamamlayıcısı ile çalışırken, sayının solundaki boşluğun pozitif sayılar için sıfırlarla, negatif sayılar için olanlarla dolu olduğuna dikkat edin. Taşıma her zaman eklenir ve 1 veya 0 olmalıdır.

Şerefe


3

2'nin tamamlayıcısı, esasen bir ikili sayının tersi ile ortaya çıkmanın bir yoludur. Kendinize şunu sorun: İkili biçimde bir sayı verildiğinde, orijinal sayıya eklendiğinde hangi bit paterni sonucu sıfır yapar? Bu bit kalıbı ile gelebiliyorsanız, o bit kalıbı orijinal sayının -ve temsili (ek ters); tanım gereği katkı tersine bir sayı eklemek her zaman sıfır ile sonuçlanmalıdır. Örnek: 101'i alın, ondalıktır 5. Şimdi görev, verilen bit desenine (101) eklendiğinde sıfır ile sonuçlanacak bir bit deseni bulmaktır. Bunu yapmak için, en sağdaki 101 bitinden başlayın ve her bir bit için tekrar aynı soruyu sorun: Sonucu sıfırlamak için "bu" bite ne bit eklemeliyim? her zamanki aktarımı dikkate alarak bunu yapmaya devam edin. En sağdaki 3 yerle (baştaki sıfırlara bakılmaksızın orijinal sayıyı tanımlayan basamaklar) bitirdikten sonra son taşıma, katkı maddesi tersinin bit deseninde gider. Ayrıca, orijinal sayıyı tek bir baytta tutabileceğimiz için, katkı tersinin diğer tüm önde gelen bitleri de 1 olmalıdır, böylece bilgisayar "o" depolama türünü (char) kullanarak numarayı ve katkı tersini eklediğinde bu karakterdeki sonuç tamamen sıfır olur.

 1 1 1
 ----------
   1 0 1
 1 0 1 1 ---> additive inverse
  ---------
   0 0 0

2

Lavinio'nun cevabını beğendim, ancak değişen bitler biraz karmaşıklık katıyor. Genellikle işaret bitine saygı gösterirken veya işaret bitine saygı göstermezken bitleri hareket ettirme seçeneği vardır. Bu, sayıları imzalı (bir kırıntı için -8 ila 7, bayt için -128 ila 127) veya tam aralıklı işaretsiz sayılar (nibble için 0 ila 15, bayt için 0 ila 255) arasındaki seçimdir.


2

Negatif tamsayıları, bir veri tipindeki bit kombinasyonunun yaklaşık yarısının negatif tamsayılar için ayrılacağı şekilde kodlamanın akıllıca bir yoludur ve negatif tamsayıların çoğunun karşılık gelen pozitif tamsayılarına eklenmesi bir taşıma taşmasıyla sonuçlanır sonucu ikili sıfır olarak bırakır.

Yani, 2'nin tamamlayıcısında biri 0x0001 ise -1 0x1111'dir, çünkü bu toplam 0x0000 toplamına (1 taşması ile) neden olacaktır.


1

Two'nun tamamlayıcısı, negatif bir sayıyı ifade etmenin yollarından biridir ve denetleyicilerin ve işlemcilerin çoğu, 2'nin tamamlayıcı formunda negatif bir sayı depolar


1
Bu, diğer yanıtlar tarafından sağlanan bilgilere hiçbir şey katmaz.
Adrian Mole

1

Two'nun tamamlayıcısı esas olarak aşağıdaki nedenlerle kullanılır:

  1. 0'ın birden çok gösterimini önlemek için
  2. Taşma durumunda taşıma bitini (tamamlayıcısında olduğu gibi) takip etmekten kaçınmak için.
  3. Toplama ve çıkarma gibi basit işlemleri gerçekleştirmek kolaylaşır.

0

REFERANS: https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html

Tüm bitleri ters çevirir ve 1 eklerim. Programlı olarak:

  // in C++11
  int _powers[] = {
      1,
      2,
      4,
      8,
      16,
      32,
      64,
      128
  };

  int value=3;
  int n_bits=4;
  int twos_complement = (value ^ ( _powers[n_bits]-1)) + 1;

Montajcı bile çok yüksek olabilir. Ekleme mantığının kapı seviyesi şemasını görmeniz gerekir. T döngüleri ile. Algoritmik olarak haklısınız.
mckenzm

0

2'nin verilen bir sayıyı tamamlaması no. 1'in 1'in tamamlayıcısı ile 1 ekleyerek var. varsayalım, bir ikili no var: 10111001101 1'in tamamlayıcısı: 01000110010 Ve 2'nin tamamlayıcısı olacak: 01000110011


0

Bir sayıyı bitsel olarak tamamlamak, içindeki tüm bitleri çevirmektir. İkisini tamamlamak için, tüm bitleri çevirip bir tane ekliyoruz.

İşaretli tamsayılar için 2'nin tamamlayıcı gösterimini kullanarak, pozitif bir sayıyı negatif eşdeğerine dönüştürmek için 2'nin tamamlayıcı işlemini uygularız (ya da tam tersi). Yani bir örnek için nibbles kullanmak, 0001(1) 1111(-1) olur ve op'u tekrar uygulamak geri döner 0001.

Operasyonun sıfırdaki davranışı, pozitif ve negatif sıfırların özel kullanımı olmadan sıfır için tek bir gösterim verilmesinde avantajlıdır. 1 eklendiğinde 0000tamamlar 1111. 0000pozitif ve negatif olmaktan ziyade bir sıfır vererek bize taşar .

Bu gösterimin önemli bir avantajı, işaretsiz tamsayılar için standart ekleme devrelerinin kendilerine uygulandığında doğru sonuçlar vermesidir. Örneğin, nibbles'a 1 ve -1 eklemek: 0001 + 1111bitler kayıttan taşarak geride kalır 0000.

Nazik bir giriş için, harika Computerphile konuyla ilgili bir video hazırladı .


0

Basit 2's Complementbir ifadeyle, negatif sayıyı Bilgisayar Belleğinde saklamanın bir yoludur. Pozitif Sayılar Normal İkili Sayı olarak kaydedilir.

Bu örneği ele alalım,

Bilgisayar Binary Number Systemherhangi bir sayıyı temsil etmek için kullanır .

x = 5;

Bu olarak temsil edilir 0101.

x = -5;

Bilgisayar kodlayıcıları -imzaladığında, 2'nin tamamlayıcısını hesaplar ve saklar. i.e5 = 0101 ve 2'nin tamamlayıcısı 1011.

Bilgisayarın sayıları işlemek için kullandığı önemli kurallar,

  1. İlk bit ise sayı 1olmalıdır negative.
  2. İlk bit hariç tüm bitler 0pozitif bir sayıdır, çünkü -0sayı sisteminde yoktur . ( 1000 is not -0Bunun yerine pozitiftir 8)
  3. Tüm bitler varsa 0o zaman 0.
  4. Yoksa bu bir positive number.


-6

En basit cevap:

1111 + 1 = (1) 0000. Yani 1111 -1 olmalı. Sonra -1 + 1 = 0.

Bunları benim için anlamak mükemmel.


Bu soruya bir cevap sağlamaz. Bir yazardan eleştiri veya açıklama istemek için gönderilerinin altına bir yorum bırakın.
Codor

Cevap. En basit. Benim için - en iyisi.
Dmitry
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.