4 bitlik bire tümleyen sayı çarkı. Tepede sıfırın iki gösterimi (+0 ve −0) yan yana durur.

Bire tümleyen (İngilizce: one's complement), n bitlik bir ikili sayının bütün bitleri terslenerek, 0'lar 1 ve 1'ler 0 yapılarak elde edilen sayıdır. Aynı ad, eksi sayıları bu yolla gösteren işaretli tam sayı gösterimi için de kullanılır. n bitlik N sayısının bire tümleyeni (2n − 1) − N değerine eşittir. Donald Knuth, iki adın farkını tümlemenin neye göre yapıldığıyla açıklar. İkiye tümleyen bir sayı 2'nin tek bir kuvvetine göre, bire tümleyen bir sayı ise bütün basamakları 1 olan bir diziye göre tümlenir.

Bire tümleyen gösterimi 1960'larda CDC 6600, UNIVAC 1107 ve 1108 ile PDP-1 gibi bilgisayarlarda kullanıldı. C ve C++ dillerinin güncel standartları işaretli tam sayılar için yalnız ikiye tümleyen gösterimine izin verir. Bire tümleyen aritmetiği bugün İnternet protokollerinin sağlama toplamında kullanılmaya devam eder.

Bitlerin terslenmesi

Bir sayının bire tümleyenini bulmak için her bitin tersi alınır. Örneğin 8 bitlik 0110 1001 sayısı onlu tabanda 105'tir. Bitleri terslenince 1001 0110 elde edilir. Bu bit dizisi işaretsiz okunursa 150'ye, bire tümleyen gösteriminde okunursa −105'e karşılık gelir. İki değerin toplamı 255, 8 bitle yazılabilen en büyük sayıdır.

Bire tümleyende bir sayının eksisini almak bu terslemenin kendisidir. Her bitin tersi ötekilerden bağımsız olarak aynı anda alınabildiği için bu işlem elde yayılımı gerektirmez. İkiye tümleyende ise terslemenin ardından 1 eklenir ve bu ekleme elde yayılımına yol açabilir.

İşaretli gösterim

4 bitlik bire tümleyen gösteriminde +0 ile +7 ve −0 ile −7 arasındaki sayılar

Bire tümleyen gösteriminde en soldaki bit işaret bitidir; 0 sayının artı, 1 eksi olduğunu gösterir. Eksi bir sayı, artı karşılığının bitleri terslenerek yazılır. 4 bitle −7 ile +7 arasındaki sayılar gösterilebilir. Genel olarak n bitle gösterilebilen aralık −(2n−1 − 1) ile +(2n−1 − 1) arasındadır; ikiye tümleyene göre eksi tarafta bir sayı eksiktir.

Sıfırın iki gösterimi

Bire tümleyende sıfırın iki ayrı gösterimi vardır. Bütün bitleri 0 olan dizi artı sıfırı, bütün bitleri 1 olan dizi eksi sıfırı gösterir. C dilinin 2011 standardı bu ikinci değeri "eksi sıfır" diye adlandırıyordu.

İki sıfır, bilgisayarların sıfır sınamasını ve karşılaştırmalarını karmaşıklaştırır. CDC 6600'ün başvuru kılavuzu, bazı karşılaştırma buyruklarında artı sıfırın eksi sıfıra eşit sayılmadığını belirtir. PDP-1 ise karışıklığı azaltmak için bazı aritmetik işlemlerde −0'ı kendiliğinden +0'a çevirirdi.

Bir sayı ile eksisi olağan bir toplayıcıda toplanınca sonuç her zaman bütün bitleri 1 olan eksi sıfırdır; örneğin 4 bitte 0101 + 1010 = 1111 çıkar. Eksi sıfır hesapta sıfır gibi davranır ve bir sayıya eklendiğinde o sayıyı değiştirmez. Toplamayı çıkarma devresiyle yapan bilgisayarlarda ise eksi sıfır yalnızca iki durumda çıkar. Bunlar −0 ile −0'ın toplanması ve −0'dan +0'ın çıkarılmasıdır; öteki bütün sıfır sonuçlar artı sıfırdır.

İşaretle genişletme

Bire tümleyen bir sayı daha geniş bir yazmaca yerleştirilirken işaret biti üstteki bütün bitlere kopyalanır. Örneğin 4 bitlik 1010 (−5), 8 bitte 1111 1010 olarak yazılır. İşaretle genişletme ikiye tümleyende de aynı biçimde yapılır.

Toplama ve çıkarma

Bire tümleyende A − B işlemi, A ile B'nin bire tümleyeni toplanarak yapılır. Toplama sırasında en soldaki bitten bir elde taşarsa bu elde atılmaz; sonuca 1 olarak eklenir ve sonuç böylece düzeltilir. Düzeltme gerekir, çünkü elde taştığında bulunan toplam doğru farktan bir eksiktir. Elde taşmazsa sonuç eksi bir sayıdır ve bire tümleyen gösteriminde doğrudan okunur.

4 bitlik iki örnek:

  • 5 − 3 işleminde 0101 ile 0011'in bire tümleyeni olan 1100 toplanır. Toplam 1 0001 çıkar, en soldan bir elde taşar. Bu elde sonuca eklenir, 0001 + 1 = 0010, sonuç +2'dir.
  • 3 − 5 işleminde 0011 ile 0101'in bire tümleyeni olan 1010 toplanır. Toplam 1101 çıkar ve elde taşmaz. 1101, 0010'un bire tümleyeni olduğundan sonuç −2'dir.

Çıkarma, toplamaya çevrilmeden doğrudan da yapılabilir. Bu durumda en soldaki bit daha soldan borç almak zorunda kalırsa, bu borç sonucun en sağdaki bitinden çıkarılır ve sonuç böylece düzeltilir. Örneğin 4 bitte 0011 − 0101 işleminde en soldan borç alınır ve ara sonuç 1110 çıkar. Borç sonuçtan çıkarılınca 1101 bulunur, bu da −2'dir. Bu iki düzeltme, bire tümleyen aritmetiğinin 2n − 1 modunda yapılmasının sonucudur.

CDC 6600 ile UNIVAC 1107 ve 1108, toplamayı çıkarma devresiyle yapan toplayıcılar kullandı. Bu düzen, örneğin +1 ile −1 toplandığında sonucun eksi sıfır yerine artı sıfır çıkmasını sağlıyor ve sıfır sınamasını kolaylaştırıyordu.

İkiye tümleyen ile karşılaştırma

Bir sayının ikiye tümleyeni, bire tümleyenine 1 eklenerek bulunur.

Bire tümleyen ve ikiye tümleyen gösterimlerinin karşılaştırması
Özellik Bire tümleyen İkiye tümleyen
Sıfırın gösterimi İki ayrı gösterim (+0 ve −0) Tek gösterim
n bitle aralık −(2n−1 − 1) … +(2n−1 − 1) −2n−1 … +(2n−1 − 1)
Toplamada taşan elde Sonuca eklenerek sonuç düzeltilir Atılır
Kullanım 1960'ların bazı bilgisayarları, İnternet sağlama toplamı C23 ve C++20 standartlarının öngördüğü gösterim

Kullanıldığı bilgisayarlar

Bire tümleyen aritmetiği 1950'ler ve 1960'larda yaygındı. ERA 1101'in 24 bitlik sözcükleri bu gösterimi kullanıyordu. Control Data Corporation'ın 12 bitlik CDC 160'ı ile 48 bitlik CDC 1604'ü de bütün aritmetik işlemlerini bire tümleyenle yaptı. Laboratuvar bilgisayarı LINC, 12 bitlik sözcüklerinde aynı gösterimi kullandı. CDC 6600 60 bitlik tam sayılarda bire tümleyen toplama ve çıkarma yaptı, ardılı Cyber 170 serisi de bu aritmetiği sürdürdü. UNIVAC 1108'in toplayıcısı 36 bitlik, çıkarmalı bir bire tümleyen toplayıcısıydı. Aynı ailenin ardılı olan Unisys 2200 serisi 1991'de de bire tümleyen tam sayıları destekliyordu.

İnternet sağlama toplamı

IPv4 başlığındaki sağlama toplamı, başlıktaki bütün 16 bitlik sözcüklerin bire tümleyen toplamının 16 bitlik bire tümleyenidir. UDP de sağlama toplamını aynı yöntemle hesaplar; hesaplanan değer sıfır çıkarsa, bire tümleyendeki eşdeğeri olan bütün bitleri 1 biçimiyle gönderilir.

RFC 1071'e göre bu toplam hesaplanırken en anlamlı bitlerden taşan elde en düşük anlamlı bitlere eklenir. Alıcı taraf aynı toplamı sağlama toplamıyla birlikte hesaplar; sonuç bütün bitleri 1, bire tümleyende −0, çıkarsa denetim başarılı sayılır. Bire tümleyen toplamı baytların hangi sırayla dizildiğinden bağımsızdır, bu yüzden bayt dizilişi farklı bilgisayarlarda aynı biçimde hesaplanabilir.

Programlama dillerinde

C dili 2011 standardına kadar işaretli tam sayıların bire tümleyenle gösterilmesine izin veriyordu. 2019 tarihli N2412 önerisi C23 standardına alındı ve bu seçenek kaldırıldı; C23'te yalnız ikiye tümleyen gösterimi bulunur. C++ dili de aynı değişikliği C++20 standardında yaptı.

Ayrıca bakınız

Kaynakça

  1. ^ a b c Mano, M. Morris; Ciletti, Michael D. (2018). Digital Design: With an Introduction to the Verilog HDL, VHDL, and SystemVerilog (İngilizce) (6 bas.). Pearson. s. 12. ISBN 978-0-13-454989-7. 
  2. ^ Knuth, Donald E. (1997). The Art of Computer Programming, Volume 2: Seminumerical Algorithms (İngilizce) (3 bas.). Addison-Wesley. s. 203-204. ISBN 0-201-89684-2. 
  3. ^ a b c Thornton, J. E. (1970). Design of a Computer: The Control Data 6600 (PDF) (İngilizce). Scott, Foresman and Company. s. 63-65. 
  4. ^ a b c d "UNIVAC 1108 Processor and Storage (UP-4053)" (PDF) (İngilizce). Sperry Rand Corporation. 1966. s. 4-4. Erişim tarihi: 14 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
  5. ^ a b c "PDP-1 Handbook" (PDF) (İngilizce). Digital Equipment Corporation. Ekim 1963. s. 7. Erişim tarihi: 14 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
  6. ^ a b "ISO/IEC 9899:2023 Working Draft N3096" (PDF) (İngilizce). ISO/IEC JTC1/SC22/WG14. 1 Nisan 2023. s. 42. Erişim tarihi: 14 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
  7. ^ a b "Working Draft, Standard for Programming Language C++ (N4861)" (PDF) (İngilizce). ISO/IEC JTC1/SC22/WG21. 1 Nisan 2020. s. 70. Erişim tarihi: 14 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
  8. ^ a b R. Braden, D. Borman, C. Partridge (Eylül 1988). "RFC 1071: Computing the Internet Checksum" (İngilizce). IETF. Erişim tarihi: 14 Eylül 2026. KB1 bakım: Birden fazla ad: yazar listesi (link) Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
  9. ^ a b c d "160-A Computer Programming Manual" (PDF) (İngilizce). Control Data Corporation. 1963. s. 2-2, 3-15. Erişim tarihi: 15 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
  10. ^ Koren, Israel (1993). Computer Arithmetic Algorithms (İngilizce). Prentice Hall. s. 11, 160. ISBN 0-13-151952-2. 
  11. ^ a b Mano, M. Morris; Ciletti, Michael D. (2018). Digital Design: With an Introduction to the Verilog HDL, VHDL, and SystemVerilog (İngilizce) (6 bas.). Pearson. s. 18-19. ISBN 978-0-13-454989-7. 
  12. ^ a b "ISO/IEC 9899:201x Committee Draft N1570" (PDF) (İngilizce). ISO/IEC JTC1/SC22/WG14. 12 Nisan 2011. s. 46. Erişim tarihi: 14 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
  13. ^ "Control Data 6400/6500/6600 Computer Systems Reference Manual" (PDF) (İngilizce). Control Data Corporation. Şubat 1967. s. 3-46. Erişim tarihi: 14 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
  14. ^ a b Mary Allen Wilkes, Wesley A. Clark (1969). "Programming the LINC" (PDF) (İngilizce) (2 bas.). Washington University. s. 4-5, 23. Erişim tarihi: 15 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
  15. ^ a b c Blaauw, Gerrit A.; Brooks, Frederick P. (1997). Computer Architecture: Concepts and Evolution (İngilizce). Addison-Wesley. s. 228, 860. ISBN 0-201-10557-8. 
  16. ^ a b c "160 Computer Programming Manual" (PDF) (İngilizce). Control Data Corporation. 1960. s. 29. Erişim tarihi: 15 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
  17. ^ a b "CDC Cyber 170 Computer Systems Hardware Reference Manual" (PDF) (İngilizce). Control Data Corporation. s. 4-30. Erişim tarihi: 15 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
  18. ^ Mano, M. Morris; Ciletti, Michael D. (2018). Digital Design: With an Introduction to the Verilog HDL, VHDL, and SystemVerilog (İngilizce) (6 bas.). Pearson. s. 15. ISBN 978-0-13-454989-7. 
  19. ^ "1604-C Computer Reference Manual" (PDF) (İngilizce). Control Data Corporation. 1967. s. Ek I, 4. Erişim tarihi: 15 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
  20. ^ "Ada Compiler Validation Summary Report: UNISYS Corporation, UCS Ada, Version 1R1, 2200/600" (İngilizce). National Institute of Standards and Technology. 1991. s. F-16. Erişim tarihi: 15 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
  21. ^ J. Postel (Eylül 1981). "RFC 791: Internet Protocol" (İngilizce). IETF. s. 14. Erişim tarihi: 14 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
  22. ^ J. Postel (28 Ağustos 1980). "RFC 768: User Datagram Protocol" (İngilizce). IETF. s. 2. Erişim tarihi: 14 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
  23. ^ JF Bastien, Jens Gustedt (11 Ağustos 2019). "Two's complement sign representation for C2x (N2412)" (PDF) (İngilizce). ISO/IEC JTC1/SC22/WG14. Erişim tarihi: 14 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
  24. ^ JF Bastien (6 Ekim 2018). "Signed Integers are Two's Complement (P0907R4)" (İngilizce). ISO/IEC JTC1/SC22/WG21. Erişim tarihi: 14 Eylül 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)