Bir matematikçi, hidrolog ve programcı olan Kazakov Vladimir Mihayloviç tarafından yapılmış bir not.
**BCD (Binary Coded Decimal) kodu**, bilgisayar ve elektronik sistemlerinde onluk tabandaki (decimal) sayıların ikilik tabana (binary) dönüştürülmesi için kullanılan sayısal kodlama metodudur. Bu dönüştürme işlemi yapılırken öncelikle sayının her bir basamağı tek tek ikilik tabana (genellikle dört veya sekiz bit ile ifade edilir ancak farklı uzunluklarda da olabilir) çevrilir ve ardından her basamağın karşılık geldiği binary değerler sırasıyla birleştirilerek sayının BCD Kodu ile gösterimi elde edilir.

Bir bilgisayar için en doğal sistem ikili sistem olmasına rağmen, çoğu insan ondalık sisteme daha alışkındır. BCD Kodu'nun en büyük avantajı da elektronik sistemlerde BCD ile kodlanmış olarak kullanılan ikilik tabandaki sayıların insanlar tarafından kolaylıkla anlaşılıp onluk sisteme çevrilebilmesidir.

BCD Kodu günümüzde eskisi kadar yaygın olarak kullanılmamakla birlikte geçmişte onluk sistemi kullanan (decimal computer) bilgisayarlarda yaygın olarak kullanılmıştır. Günümüzde de tam sayı veya ondalıklı sayı işlemlerinin önemli olduğu finans, sanayi ve ticaret gibi alanlardaki sistemlerde kullanılmaktadır.

Temel Bilgiler
--------------

Girişte de bahsedildiği gibi, BCD Kodu kullanılarak onluk tabandaki sayılar ikili tabanda 4 bit ile gösterilebilir.

```
**Onluk**    **İkilik**    **BCD(8421)**
 0        0000      0000
 1        0001      0001
 2        0010      0010
 3        0011      0011
 4        0100      0100
 5        0101      0101
 6        0110      0110
 7        0111      0111
 8        1000      1000
 9        1001      1001
 10       1010      0001 0000
 11       1011      0001 0001
 12       1100      0001 0010
 13       1101      0001 0011
 14       1110      0001 0100
 15       1111      0001 0101
```

*Tablodaki 8421 ifadesi ikili sistemdeki basamakları (23222120) göstermektedir.*

Onluk tabadaki sayıları BCD'ye göre kodlamak için şu methodlar kullanılabilir:

* **Genişletilmiş (Uncompressed) BCD**: Onluk tabandaki sayının her basamağı 1 byte ile gösterilir. Gösterimin ilk 4 biti herhangi bir büyüklüğü ifade etmezken, son 4 biti sayının ikili tabandaki gösterimine eşittir.

Onluk tabandaki `**91**` sayısı Uncompressed BCD'ye göre şu şekilde kodlanır:

```
 Onluk Taban:          9          1
 İkilik Taban: 0000 1001  0000 0001
```

* **Sıkıştırılmış (Packed) BCD**: Onluk tabandaki sayının her iki basamağı 1 byte ile gösterilir. İlk 4 bit (0-3) en anlamsız kısım (the least significant nibble), diğer 4 bit en anlamlı kısım (the most significant nibble) olarak adlandırılır.

Onluk tabandaki `**91**` sayısı Packed BCD'ye göre şu şekilde kodlanır:

```
Onluk Taban:    9    1
İkilik Taban: 1001 0001
```

Sonuç olarak, uncompressed BCD 0-9 aralığındaki (9 dahil), packed BCD ise 0-99 aralığındaki (99 dahil) sayılar için kullanılabilir.

Bir byte'dan daha büyük olan sayılar BCD ile kodlanırken ardışık byte'lar kullanılabilir. Örneğin onluk tabandaki `**12345**` sayısı packed BCD ile şu şekilde kodlanır:

```
 Onluk Taban:          1     2    3     4    5
 İkilik Taban: 0000 0001  0010 0011  0100 0101
```

Bu örnekte baştaki en anlamlı 4 bit sayının asıl değerinin `**012345**` olduğunu göstermektedir.

Verilen öneklerden de anlaşılacağı üzere uncompressed BCD kullanarak yapılan kodlama packed BCD'ye göre yüzde yüz daha fazla hafıza gerektirir.

Elektronik Sistemlerde BCD Kodu
-------------------------------

BCD sayısal bir değerin gösterildiği ve özellikle sayısal mantığa dayalı elektronik sistemlerde oldukça yaygındır. BCD sayesinde, sayısal bir veride değişim yapmak oldukça kolay bir hal alır. Çünkü her rakam ayrı bir alt devre gibi incelenir. Eğer sayısal değerler yalnızca ikilik tabanda depolanıyor ve değiştiriliyorsa, böyle bir displayi arayüzlemek daha karmaşık bir devre gerektirir. Bu nedenle, bazı hesaplamalarda ikilik sisteme çevirmek yerine BCD koduna çevirmek daha basit ve kolaydır.
Gömülü bir mikrodenetleyici ve diğer işlemciler kullanıldığında da aynı teknik uygulanır. Genellikle kısa kodlar, ikilik tabandaki bir sayıyı BCD formatına çevirmek masraflı bir işlem olduğu için kısıtlı kapasitede işlemcilerin oluşmasına neden olurlar.

Sıkıştırılmış BCD
-----------------

İki basamağın her birinin 8 bitte kodlanmasına sıkıştırılmış BCD (packed BCD ya da packed decimal) denir. Sıkıştırılmış BCD 1960'lardan bu yana kullanılmaya başlanmıştır ve bütün IBM merkezi işlemci donanımlarda uygulanmıştır. Çoğu gösterimde bir ya da iki bayt on tabanında bir tam sayıyı ifade eder. Her bir baytta iki tane dörtlü bit (İngilizce'de nibble olarak ifade edilir.) vardır, bu dörtlü bitlerin her biri bir onluk tabandaki rakamı gösterir. En üstteki(hafızadaki adresi üstte olan) dörtlü en anlamlı, diğer dörtlü ise en anlamsız basamak şeklinde adlandırılır. En sağdaki baytın en anlamsız dörtlüsü genellikle işareti gösterir. Örneğin, 4 baytlık bir değer 8 tane dörtlü içerir. En üstteki 7 dörtlü), 7 rakamlı onluk tabandaki değerin rakamlarını hafızada tutar ve en alttaki dörtlü onluk tam sayı değerinin işaretini gösterir.

Standart işaret değerleri pozitifler için 1100 (on altılık tabanda C) ve negatifler için 1101 (on altılık tabanda D)'dir. On altılık tabandaki bu kısaltmalar C için Credit, D için Debit'ten gelir, bunun nedeni sıkıştırılmış BCD'nin muhasebede yaygın olarak kullanılmasından kaynaklanır. Ayrıca pozitif sayılarda 1010 (A), 1110 (E) ve negatif sayılarda 1011 (B) işaretleri de bulunmaktadır. 127 sayısı sıkıştırılmış BCD'de 0001 0010 0111 1100 (127C) şeklinde, -127 sayısı ise 0001 0010 0111 1101 (127D) olarak gösterilir.

| İşaretBasamağı | BCD8 4 2 1 | İşaret |
| --- | --- | --- |
| A | 1 0 1 0 | **+** |
| B | 1 0 1 1 | **−** |
| C | 1 1 0 0 | **+** |
| D | 1 1 0 1 | **−** |
| E | 1 1 1 0 | **+** |
| F | 1 1 1 1 | **+** |
|

Bir bit dizisi ne kadar uzun olursa olsun her zaman çift sayıda dörtlü vardır çünkü her bir baytta 2 dörtlü vardır. Bu nedenle, bir *n* uzunluğunda bit dizisi en fazla (2*n*-1) tane onluk tabanda rakam (rakam sayısı tek sayıda olacak şekilde) içerebilir. *d* basamaklı bir onlu sayı 1/2(d+1) baytlık bir hafıza alanını kaplar.
Örneğin, 32 bitlik bir bit dizisinde işaret ile birlikte 7 tane onluk tabanda rakam vardır ve bu dizi +-9,999,999 aralığındaki bütün sayıları temsil edebilir. Yani -1,234,567 sayısı 7 basamaklıdır ve aşağıdaki gibi kodlanır:

```
0001 0010 0011 0100 0101 0110 0111 1101
   *1 2 3 4 5 6 7 −*
```

Ancak, yine 32 uzunluğunda bir bit dizisinin 2'ye tümleyeni ile -2,147,483,648'den -2,147,483,647' ye kadar olan bütün tam sayıları gösterebiliriz.
Sıkıştırılmış BCD bellek kullanımı açısından çok verimli olmamasına karşın ASCII, EBCDIC, veya Unicode'un diğer kodlama çeşitleri aritmetik işlemler gerektirdiği için çok kullanılmaz.
Sıkıştırılmış BCD fixed-point packed decimal ve higher-density encodings olmak üzere ikiye ayrılır.

Ayrılmış Onlu
-------------

Ayrılmış onlu sayısal gösteriminde onluk tabandaki her rakamın en alttaki dört biti bellekte bir baytlık alanda saklanır. En üstteki dört bit ise ayrılmış bitler olarak ifade edilir ve genellikle sabit bir değere ayarlanır, böylece saklanan baytta rakamı ifade eden bir karakter değeri tutulur. EBCDIC sistemleri 1111 ayrılmış değerini kullanırlar. Bu değer EBCDIC kodunda 0'dan 9'a kadar kadar herhangi bir karakter değerini alabilir. Aynı şekilde ASCII'de de 0011 ayrılmış değeri kullanılır. Bu ayrılmış değer on altılık tabanda 30'dan 39'a kadar olan karakterleri ifade eder.

İşaretli ayrılmış onlu değerlerinde en anlamsız ayrılmış dörtlü işaret rakamını gösterir (işaretli sıkıştırılmış BCD ile aynı değerlerdir.). Örneğin -123 sayısının ayrılmış onlu değeri on altılık tabanda F1 F2 D3 şeklinde kodlanır:

```
 F1 F2 D3
  *1 2 -3*
```

### EBCDIC sisteminde ayrılmış onluyu dönüştürme tablosu

| BCD Rakamı | 16'lık Taban | EBCDIC Karakteri |
| --- | --- | --- |
| `0+` | `C0` | `A0` | `E0` | `F0` | `{` (\*) |   | `\` (\*) | `0` |
| `1+` | `C1` | `A1` | `E1` | `F1` | `A` | `~` (\*) |   | `1` |
| `2+` | `C2` | `A2` | `E2` | `F2` | `B` | `s` | `S` | `2` |
| `3+` | `C3` | `A3` | `E3` | `F3` | `C` | `t` | `T` | `3` |
| `4+` | `C4` | `A4` | `E4` | `F4` | `D` | `u` | `U` | `4` |
| `5+` | `C5` | `A5` | `E5` | `F5` | `E` | `v` | `V` | `5` |
| `6+` | `C6` | `A6` | `E6` | `F6` | `F` | `w` | `W` | `6` |
| `7+` | `C7` | `A7` | `E7` | `F7` | `G` | `x` | `X` | `7` |
| `8+` | `C8` | `A8` | `E8` | `F8` | `H` | `y` | `Y` | `8` |
| `9+` | `C9` | `A9` | `E9` | `F9` | `I` | `z` | `Z` | `9` |
| `0−` | `D0` | `B0` |   |   | `}`  (\*) | `^`  (\*) |   |   |
| `1−` | `D1` | `B1` |   |   | `J` |   |   |   |
| `2−` | `D2` | `B2` |   |   | `K` |   |   |   |
| `3−` | `D3` | `B3` |   |   | `L` |   |   |   |
| `4−` | `D4` | `B4` |   |   | `M` |   |   |   |
| `5−` | `D5` | `B5` |   |   | `N` |   |   |   |
| `6−` | `D6` | `B6` |   |   | `O` |   |   |   |
| `7−` | `D7` | `B7` |   |   | `P` |   |   |   |
| `8−` | `D8` | `B8` |   |   | `Q` |   |   |   |
| `9−` | `D9` | `B9` |   |   | `R` |   |   |   |

BCD ile Toplama İşlemi
----------------------

Öncelikle ikilik tabanda toplama işlemi yapılır sonra sonuç BCD'ye çevrilir. Eğer toplamın değeri 9'dan büyükse, bu toplamı BCD'ye çevirmenin kolay bir yolu sayıya 6 eklemektir. Örneğin;

```
 1001 + 1000 = 10001
    9 +    8 =    17
```

Burada istenen sonucun onluk tabanda değil ikilik tabanda olduğunu görüyoruz. BCD'de onluk tabanda olduğu gibi bir basamaktaki rakamın değeri 9'dan büyük olamaz. Bu durumu düzeltmek için toplama 6 (0110) eklenir ve sonuç 2 dörtlüye ayrılır:

```
 10001 + 0110 = 00010111 => 0001 0111
    17 +    6 =       23       1    7
```

Sonucun dörtlülere ayrılmış halinde 0001 1'i ve 0111 7'yi ifade eder. Bu sayı BCD'de 17'yi ifade eder.

Bu yöntem birden fazla rakamın toplanması durumu için de geçerlidir. Böyle bir durumda gruplar toplanarak sağdan sola doğru gidilir ve toplamın 2.basamağı elde olarak tutulur. Sonucun her biti için 9 olup olmadığı kontrol edilir.

BCD ile Çıkarma İşlemi
----------------------

Çıkarma işlemi, eksilene çıkarılanın ona tümleyeni(ten's complement) eklenerek yapılır. BCD ile sayıların işareti gösterilirken; pozitif sayılar için 0000, negatif sayılar için 1001 kullanılır (diğer 14 ihtimal işaret açısından bir anlam taşımaz).

BCD kullanılarak 357 - 432 işlemi şu şekilde yapılır:

İşaretiyle birlikte 357 sayısının (eksilen) BCD gösterimi 0000 0011 0101 0111'dir. -432 sayısının (çıkan) ona tümleyeni bulunurken sayının dokuza tümleyeni alınıp bu değere 1 eklenir, dolayısıyla 999 − 432 = 567, ve 567 + 1 = 568 bulunur. Bu değer negatif olduğu için BCD karşılığı 1001 0101 0110 1000 şeklindedir. Son olarak da bu iki değer şu şekilde toplanır:

```
0000 0011 0101 0111 + 1001 0101 0110 1000 = 1001 1000 1011 1111
   0    3    5    7 +    9    5    6    8 =    9    8   11   15
```

Bulunan değerler onluk sistemde kullanılamayacağı için buradaki 1001'den büyük her BCD basamağına elde biti oluşturmak için 6 eklenir (Burada 6 eklenmesinin nedeni 24 = 16 değerden sadece 0000-1001 aralığındaki 10 değerin BCD için anlamlı olmasıdır.).Buna göre sonuç şu şekildedir:

```
1001 1000 1011 1111 + 0000 0000 0110 0110 = 1001 1001 0010 0101
   9    8   11   15 +    0    0    6    6 =    9    9    2    5
```

Bulunan 1001 1001 0010 0101 değeri işaretli gösterimde -925 değerine eşittir. 925 sayısının ona tümleyeni ise 999 - 925 = 74, ve 74 + 1 = 75'tir. Sonuç olarak 357 - 432 = -75 şeklinde BCD kullanılarak doğru hesaplanmıştır.

Farklı basamak uzunluğuna sahip sayılarda çıkarma işlemi yapılırken basamak sayısı az olanın önüne 0 eklenir. Örneğin, 1053 - 122 işlemi yapılırken 0122 sayısının ona tümleyeni eksilene eklenerek çıkarma işlemi yapılır.

Tarihçe
-------

Tabloda da belirtildiği gibi başka yöntemler de olmasına rağmen, BCD en çok kullanılan kodlama biçimidir. Tabloda BCD yöntemi BCD 8421 olarak gösterilmektedir. Burada 8421 her bir bitin ağırlığını ifade eder. Ayrıca 5.sütunda bu dört basamağın ikisinin negatif olduğuna dikkat ediniz. Tabloda gösterilmiş olan ASCII ve EBCDIC karakter kodlarının her ikisi de ayrılmış BCD'nin birer örneğidir.

Aşağıdaki tablo onluk tabandaki rakamların çeşitli BCD sistemlerindeki şekillerini göstermektedir:

|  Rakam | BCD8 4 2 1 | Fazlalık-3ya da Stibitz Kodu | BCD 2 4 2 1ya da Aiken Kodu | BCD8 4 −2 −1 | IBM 702 IBM 705IBM 7080 IBM 14018 4 2 1 | ASCII0000 8421 | EBCDIC0000 8421 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 0 | 0000 | 0011 | 0000 | 0000 | 1010 | 0011 0000 | 1111 0000 |
| 1 | 0001 | 0100 | 0001 | 0111 | 0001 | 0011 0001 | 1111 0001 |
| 2 | 0010 | 0101 | 0010 | 0110 | 0010 | 0011 0010 | 1111 0010 |
| 3 | 0011 | 0110 | 0011 | 0101 | 0011 | 0011 0011 | 1111 0011 |
| 4 | 0100 | 0111 | 0100 | 0100 | 0100 | 0011 0100 | 1111 0100 |
| 5 | 0101 | 1000 | 1011 | 1011 | 0101 | 0011 0101 | 1111 0101 |
| 6 | 0110 | 1001 | 1100 | 1010 | 0110 | 0011 0110 | 1111 0110 |
| 7 | 0111 | 1010 | 1101 | 1001 | 0111 | 0011 0111 | 1111 0111 |
| 8 | 1000 | 1011 | 1110 | 1000 | 1000 | 0011 1000 | 1111 1000 |
| 9 | 1001 | 1100 | 1111 | 1111 | 1001 | 0011 1001 | 1111 1001 |
|

### Binary ile BCD'nin karşılaştırılması

- BCD kodlama ikilik sistemden daha verimsizdir. Örneğin, (10)10 sayısını gösterebilmek için BCD'de 8 bit gerekirken binary sistemde 4 bit yeterlidir.
- BCD'de aritmetik işlemler karmaşıktır.
- Sayıların BCD'den onluk sisteme, onluk sistemden BCD'ye çevrimi ikilik sisteme göre daha kolaydır.

Diğer BCD Gösterimleri
----------------------

Diğer sayı sistemlerinde kullanılabilecek çeşitli BCD gösterimleri mevcuttur. Bunlardan bazıları şu şekildedir:

### İşaretli Gösterimler

İşaretli onluk tabandaki sayılar farklı şekillerde ifade edilebilir. Örneğin COBOL programlama dil 5 farklı ayrılmış onlu formatı için uygun bir dildir. Bu formatlardan her biri sayının işaretini farklı şekillerde ifade eder:

| Tip | Tanım | Örnek |
| --- | --- | --- |
| İşaretsiz | İşareti gösteren bit yok | `F1 F2 F3` |
| Standart form | İşareti gösteren 4 bit en anlamsız bayttadır | `F1 F2 C3` |
| Signed leading *(overpunch)* | İşareti gösteren 4 bit en anlamlı bayttadır | `C1 F2 F3` |
| Ayrılmış standart form | İşareti gösteren karakter baytları (`'+'` ya da `'−'`) sondadır | `F1 F2 F3 2B` |
| Signed leading separate | İşareti gösteren karakter baytları (`'+'` ya da `'−'`) baştadır | `2B F1 F2 F3` |

### Telefonlarda BCD

TBCD (Telephony Binary Coded Decimal), BCD kodunda kullanılmayan 6 değerlerle özel telefon karakterlerinin gösterilmesinde kullanılır.

| Onluk TabandakiKarakterler | BCD8 4 2 1 |
| --- | --- |
| \* | 1 0 1 0 |
| # | 1 0 1 1 |
| a | 1 1 0 0 |
| b | 1 1 0 1 |
| c | 1 1 1 0 |
| Basamak sayısı tek olduğunda | 1 1 1 1 |
|