Two's Complement'ın avantajları nelerdir?


11

Bazı ADC / DAC cihazlarında, verileri 2'nin Tamamlayıcı formunda çıkış / giriş seçenekleri vardır.

Dijital verileri Two's Complement formunda temsil etmenin avantajları nelerdir? Basit bir ikili kodunuz olduğunda ve dönüştürme süresinden tasarruf edebileceğiniz zaman?


4
İki'nin iltifat olduğunu ... düz bir ikili kod
Ördek mölemeye

"Cebir, ikisinin tamamlayıcısı olan bir makinede (evren) çalıştırılır" - HAKMEM 154 ( inwap.com/pdp10/hbaker/hakmem/hacks.html )
ChrisInEdmonton

2
İkinin tamamlayıcısında 5 nedir? 101. Düz ikili kodda 5 nedir? 101. İkinin tamamlayıcısında -5 nedir? 1 ... 11111011. Düz ikili kodda -5 nedir? Uhh ...
user253751

Negatif çıktıya sahip bir ADC'ye sahip olmak nadir görülen özel bir durum gibi mi görünüyor? Bu, ölçülen voltajın düşük voltaj referansından daha düşük olduğu anlamına ne demek? Ve böyle bir ADC'yi nasıl inşa edersiniz? Negatif yüke sahip kapaklarla ardışık yaklaşım ...?
Lundin

Tamamlama ve tamamlama olmak üzere iki farklı kelime olduğunu unutmayın . Buradaki konu ikisinin tamamlayıcısıdır , bu ikililer çok kibar ve çoğu zaman sizinle ilgili güzel şeyler söylese bile.
Pete Becker

Yanıtlar:


11

Two'nun imzalı tamsayıların iltifat gösterimi donanımda kolayca yapılabilir. Örneğin, olumsuzlama (yani x = -x ), sayıdaki tüm bitleri çevirip bir tane ekleyerek gerçekleştirilebilir. Aynı işlemi ham ikili dosyada (örneğin bir işaret bitiyle) gerçekleştirmek genellikle çok daha fazla iş gerektirir, çünkü akıştaki belirli bitleri özel olarak ele almalısınız. Aynı ekleme için de geçerlidir - negatif sayılar için ekleme işlemi pozitif sayılar için ekleme işlemiyle aynıdır, bu nedenle negatif durumu işlemek için ek bir mantık (punto amaçlanmamış) gerekmez.

Bu, sizin bakış açınızdan daha kolay olduğu anlamına gelmez, ancak bu verilerin bir tüketicisi olarak, cihazın tasarım çabasını ve karmaşıklığını azaltır, böylece muhtemelen daha ucuz hale getirir.


1
Bitleri çevirme sonra olumsuzlamak için 1 ekleyerek, hayır ??
Scott Seidman

2
@ScottSeidman Evet, üzgünüm, biraz unuttum. Düzeltmek için düzenlendi :)
Polinom

1
Aslında, en pickiness için, işlemci bağlı olarak almak için bir tek çevrim olabilir X = X * -1 ya da X - = 0 x , en az iki döngü karşı X = ~ x + 1
markt

@markt Evet, ancak yalnızca minimal bir cihaz (yani tam bir işlemci değil) uyguluyorsanız, silikonun karmaşıklığını en aza indirgemek mantıklıdır.
Polinom

5
+1 Ayrıca, Two'nun tamamlayıcısı sadece 0 için tek bir değere sahiptir. Diğerleri (kişinin tamamlayıcısı veya işaret biti gibi) iki olur
Mart'ta

5

ADC verileri dönüştürebilir (0 ve 5V arasındaki giriş voltajlarını diyelim) ve verilerin imzasız (0V = 0, 5V = maksimum kod) veya imzalı (2.5V = 0, 0V = maks -ve, 5V = maks. +) ettik.

2'nin tamamlayıcısının, imzalanan veriler için en yaygın bilgisayar temsili olmasına ek olarak, yukarıda açıklanan iki format arasındaki dönüşüm tamamen önemsizdir: sadece MSB'yi ters çevirin!

Bu, ADC'nin dahili mantığına eklemek için inanılmaz derecede ucuz ve ADC'ye veri sayfasında başka bir satış noktası veriyor ...


Aşağıdaki açıklama olarak ikinin tamamlayıcısı ve ofset ikili dosyası arasındaki MSB anahtarını ekledim
Scott Seidman

3

Negatif sayıların temsillerinde matematik yapmanız gerekiyorsa, ikişer tamamlayıcı bunu ikili işaretten daha kolay hale getirir ve bu da "işaretli int" veri türüyle eşleşir. Derleyiciniz bununla nasıl başa çıkacağınızı bilecektir. Aksi takdirde, saat kenelerini ileri geri dönüşüme çevirirsiniz.


1

Soruda, ADC'nin 2'nin tamamlayıcı formundaki değeri düz ikili dosyaya göre döndürmesinin daha uzun sürdüğü ima edilmektedir. Bir ADC'nin belirli bir uygulamasında durum böyle olsa da, genel olarak doğru değildir (örneğin, MSP430 serisi mikro kontrolörler, değeri düz ikili veya 2'nin tamamlayıcısı olarak bildirecek bir ADC çevresel çipine sahiptir, ancak her iki durumda da aynı sayıda döngü alır).

Bu yoldan çıkıldığında, 2'nin tamamlayıcısı ve düz ikili arasındaki seçim çoğunlukla dönüştürücülerinizin nasıl çalıştığı ve verilerinizi nasıl işlemek istediğinize bağlıdır.

Düz ikili modda, ADC size ölçülen analog miktarın büyüklüğü (neredeyse her zaman voltaj) ve tam ölçekli referans miktarı arasındaki oranı temsil eden bir sayı verir. Örneğin, 10 bitlik bir ADC, 0 ile 1023 (dahil) arasındaki değerleri döndürebilir. ADC'nin referans voltajının yarısı olan (örneğin, 2.50 Volt) bir voltaj (örneğin, 1.25 Volt) ölçerseniz, okuduğunuz ikili kod, okuyabileceğiniz maksimum değerin yarısı olacaktır - yani 512 veya ADC'de yuvarlama ve doğrusal olmama durumuna tabidir.

Örneğin, bir tanktaki roket yakıtı miktarını bildiren bir dönüştürücünüz olduğunu varsayalım. 0V, tankın boş olduğu ve 2.5V Volt'un dolu olduğu anlamına gelir. Dönüştürücüyü sadece ADC'nize bağlarsınız ve gidersiniz!

Ancak yukarıdaki paragrafta, negatif voltajları ölçmenin bir yolu olmadığını unutmayın. Ya tankın içinde ve dışında roket yakıtı akışını ölçmek isteseydik (ve bunu yapacak bir dönüştürücümüz vardı)? ADC negatif sayıları ölçemez, bu yüzden bir sorunumuz var. Bununla birlikte, 2'nin tamamlayıcı modunu kullanarak taklit etmenin kolay bir yolu vardır: Bu durumda, dönüştürücü çıkışı yeniden saptırılır, böylece sıfır noktası ADC'nin iki referans voltajı arasında yarıya düşer. Başka bir deyişle, pozitif akışlar 1.25V ve 2.50V arasındaki voltajlarla temsil edilir ve negatif akışlar 1.25V ila 0V ile temsil edilir - bu nedenle tanka akışlar 512 ila 1023 arasındaki ADC kodlarını verir ve şükrandan akar 511 - 0 arası kodlar (düz ikili biçimde).

Şimdi bu çok rahatsız edici. Herhangi bir şey yapmadan önce her ölçümden 512 çıkarmalıyız, bu da -512 ila +511 aralığında sayılar veriyor. 2'nin tamamlayıcı modunun amacı, bunu sizin için yapmasıdır!

Ancak, yine de imzalı sonuçlar üreten bir dönüştürücü ile düz ikili kullanmak isteyebilirsiniz. Örneğin, dönüştürücünüzün diferansiyel çıkışları olabilir: Bu durumda, ters çevrilmiş çıkışı ters çevrilmemiş çıkıştan çıkarmak istersiniz, bu nedenle 2'nin tamamlayıcısını kullanmanın bir avantajı yoktur.


1

İkisinin tamamlayıcı sistemi kullanımda, çünkü donanımın doğal olarak ne kadar basit çalıştığından kaynaklanıyor. Örneğin, sıfıra sıfırladığınız arabanızın kilometre sayacını düşünün. Sonra vitesi geri takın ve 1 mil geriye doğru sürün (Lütfen bunu gerçekte yapmayın). Kilometre sayacınız (mekanik ise) 0000'dan 9999'a kadar dönecektir. İkisinin tamamlayıcı sistemi benzer şekilde davranır.

resim açıklamasını buraya girin


Burada gerçekten yeni bir bilgi sunmadığımı, sadece birinin yararlı bulabileceği kilometre sayacı örneğini hatırladığımı unutmayın - gençken iki kişinin tamamlayıcı sisteminin mantığını anlamama yardımcı oldu. Bundan sonra, toplayıcıların, çıkarıcıların vb. İkisinin tamamlayıcı sistemi ile iyi çalıştığını sezgisel olarak kabul etmek benim için kolaydı.

Ve evet, Nissan'ımın kilometre sayacı bu şekilde çalışıyor.


Cevabınız taşma (ve taşma) hakkında, ancak kilometre sayacı negatif sayılar göstermediğinden, ikisinin tamamlayıcıyla ilgili hiçbir şeye hitap etmiyor ...
marcelm

@marcelm, Aslında kilometre sayacı örneği yapar ikiler tamamlayıcı açıklar. Sadece PkP açıklama ile yeterince ileri gitmedi. Altı basamaklı bir kilometre sayacı sıfırı okursa ve bir mil geri giderseniz, -1 değerini okumasını beklersiniz. Bunun yerine 999999'u okur. Bunun nedeni, 999999'un -1 basamaklı, onlarca tamamlayıcı gösterimidir.
Solomon Slow

@jameslarge Hayır, hala değil. Cevapta ikisinin tamamlayıcısına dokunan hiçbir şey yok. Ya da kişinin tamamlayıcısı, işaret büyüklüğü veya imzalı herhangi bir sayı temsili.
marcelm

@marcelm Evet var: ikisinin tamamlayıcı sisteminin en temel fikri: sıfır eksi bir temsil edilebilir maksimum işaretsiz tamsayıya eşittir. Bu ikisinin tamamlayıcı sistemi fikri. Başka hiçbir imzalı numara temsili bunu (bilgime) sunmaz. Kilometre sayacı örneği, bu davranışsal özelliğin mühendisliğin basitliğinden ne kadar doğal olarak geldiğini gösterir; kilometre sayacı durumunda: makine mühendisliğinden. Hem mekanik hem de elektronik dünyada, (ikisinin tamamlayıcı sistemi) onu çalıştırmanın en basit yoludur.
PkP

0

Diğerleri, ikili iltifat ikili neden bilgisayar donanımı için uygun cevap verdi. Ancak, bir A / D'nin "düz ikili" yerine neden ikiye iltifat çıkardığını soruyorsunuz (bunun ne anlama geldiğini düşünüyorsunuz).

Çoğu A / D, 0 ila 2 N arasında basit bir imzasız ikili değer çıkarır 1 ; burada N, A / D'nin dönüştürdüğü bit sayısıdır. Bunun iki yönlü iltifat gösterimi olarak da düşünülebileceğini unutmayın, sadece değerler asla negatif olmaz. Yalnızca pozitif sayılarla uğraşıyorsanız, çoğu ikili gösterim aynıdır. Buna iki iltifat ve işaret büyüklüğü dahildir.

Bazı A / D'lerin, özellikle mikrodenetleyicilerin içine yerleştirilenlerin, aralıklarının alt yarısı için negatif değerler üretme seçeneği vardır. Bu, bipolar sinyali ölçerken algılanan bir avantaj olabilir.

En azından bir mikrodenetleyicide, bu genellikle saçmadır. Bazı durumlarda A / D değerlerini herhangi bir dönüşüm olmadan doğrudan kullanabilirsiniz. Bu durumda, diğer tüm değerleri A / D aralığına dönüştürdünüz. Bunu negatif olmayan tüm sayılarla sınırlamak aslında işleri basitleştirir.

Aksi takdirde, A / D okumalarına dahili olarak değerler için kullandığınız herhangi bir birime ulaşmak için yine de bazı ölçeklendirme ve ofset uygulayacaksınız. Burada yine doğrudan A / D'den gelen imzasız değerlerin bir dezavantajı yoktur. Aslında, herhangi bir ölçeklendirme ve ofsetten önce ham değerlere genellikle düşük geçişli filtreleme uygularım. Bu değerlerin asla olumsuz olmayacağını bilmek hesaplamaları biraz basitleştirir. İmzasız değerlerde ölçeklendirme yapmak bazen işleri biraz daha basit hale getirir.

A / D'yi imzasız çıktı biçiminde kullandığım 100'den fazla mikrodenetleyici projesinde tek bir durumu hatırlayamıyorum.

Bu nedenle, A / D çıkışının "ikişer iltifat" ın avantajlarının ne olduğu sorusunu yanıtlamak için iki cevap vardır:

  1. Her neyse, hepsi bu değerlerin çoğu zaman negatif olmadığı için, ikişer iltifat ile işaret büyüklüğü gibi diğer gösterimler arasındaki farkı söyleyemezsiniz.

  2. Avantajları çok azdır. Mikrodenetleyici içerisinde esasen yoktur.

    Özel donanımda, negatif giriş voltajını gösteren negatif değerlere sahip olmanın bir avantajı olabilir, bu durumda iki iltifat, değer aralığı ile başa çıkmanın en kolay yoludur. Giriş voltajı aralığı yaklaşık 0 simetrik değilse, bu avantajın ortadan kalktığını unutmayın.


-1

Bahsettiğiniz bu 'düz ikili kod' nedir? Diyelim ki negatif için '1', pozitif için '0' (ya da tam tersi ). Bunun, iki kez tamamlayıcıdan daha önce bahsedilmemiş iki dezavantajı vardır: biri bugünlerde büyük ölçüde alakasız ve diğeri önemli.

Büyük ölçüde alakasız olan, daha az bir sayıyı temsil edebilmenizdir - 8 bitte 255 sayı. Bu, 32 veya 64 bitiniz olduğunda oldukça ilgisizdir, ancak çalışmak için 4 veya 6 bitiniz olduğunda önemli değildir.

Daha da önemlisi, şimdi aynı sayıyı temsil etmenin iki yolu var - özellikle, 0 - +0 ve -0 ancak +0 ve -0 aynı sayıdır, bu nedenle uygulamanızın bunları karşılaştırmamanız gerekir her eşitlik kontrolü yaptığınızda rakamlar.


Sanırım burada yolun dışındasın. OP'nin imzasız bir ikili gösterimden oldukça açık bir şekilde bahsettiği bir işaret büyüklüğünden bahsediyorsunuz.
Joe Hass

1
İmzasız bir temsilden bahsediyorsanız, Two'nun tamamlayıcısının bir avantajı yoktur. Sadece biraz israf.
Jack Aidley
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.