Mikrobilgisayarda Aritmetik
SAYITLAMA DİZGELERİ
Sayıları göstermek (temsil etmek) için tarih boyunca türlü simgeler kullanılmıştır. Konumuz bu tarihi gelişimi incelemek değildir. Kullanılan sayıtlama dizgesi, aritmetik işlemleri çok kolaylaştırabilir ya da zorlaştırabilir. Örneğin, Roma sayaklarıyla çarpma ve bölme işlemlerini yapmayı deneyiniz. Roma sayıtlama dizgesinin aritmetik işlemler yapmaya hiç bir yarar sağlamadığını göreceksiniz. Sayma ve aritmetik işlemler yapma amacıyla insanoğlu uzun zaman içinde büyük uğraş vermiştir. Bu uzun sürecin sonunda, aritmetik işlemleri kolay yapmamızı sağlayan 10 tabanlı sayıtlama dizgesi küresel yaygınlık kazanmıştır. Kuramsal açıdan, herhangi bir r (r>0) tamsayısını taban kabul eden sayıtlama dizgesi kurulabilir.
r tabanlı dizgede bir gerçel sayının temsili, onlu dizgedeki gibidir. Örneğin, (anan-1 … an1an0 . b1b2 … bm )r simgesi şu sayıyı temsil eder.
an r n +an-1 r n-1 +… + a1r1 + a0r 0 + b1r -1 + b2r -2 + … + bmr -m
Buna, verilen sayının r tabanına göre açılımı diyeceğiz. Bazı sayılarda bm lerin sayısı sayılabilir sonsuz olabilir.
r tabanlı sayıtlama dizgesi içinde aritmetik işlemler, 10 tabanlı dizgede olduğu gibi kolayca yapılabilir. Herhangi bir r tabanlı dizgede yazılan sayı, istendiğinde başka bir b tabanlı dizge içindeki temsiline dönüştürülebilir. Dolayısıyla, kuramsal açıdan, sayıları hangi dizgede temsil edersek edelim ve hangi dizge içinde aritmetik işlemler yaparsak yapalım, sonuç aynı olacaktır.
Ancak, kuramsal açıdan birbirlerine denk olmakla birlikte, pratikte bazı işler için özel sayıtlama dizgelerini kullanmak daha uygundur.
10 Tabanlı (Onlu, decimal) Sayıtlama Dizgesi
Günlük yaşamda çoğunlukla sayıları 10 tabanı ile temsil ederiz. İnsanoğlu, parmak sayarak aritmetik yaptığı için, Onlu (10 tabanlı) Sayıtlama Dizgesini kullanmaya alışıktır. Bu dizgenin sayakları (digit) 0,1,2,3,4,5,6,7,8,9 dur.
Örnek. 2718 sayısını düşünelim. Bu bir simgedir ve aşağıdaki toplamı (10 tabanına göre açılımını) temsil eder:
2718 = 2x103 + 7x102 + 1x101 + 8x100 = 2000 + 700 + 10 + 8 .
Başka bir deyişle, 2718 sayısı tabloda kendi sağındaki hanelerin toplamına eşittir.
Örnek. 0.6875 sayısını onlu sayıtlama sistemine göre yazarken, bu sayının içinde 10-n lerden kaçar tane olduğunu buluruz. Bunun için, verilen sayıda önce kaç tane 1/10 olduğunu bulur onu sayıdan çıkarırız. Sonra geriye kalan kısımda kaç tane 1/100 olduğunu bulur, çıkarırız. Sonra geriye kalnda kaç tane 1/1000 olduğunu bulur, çıkarırız.Bu işleme geriye kalan sayı 0 olana kadar devam ederiz. Bu işlem, sayının 10-n lerin bazı katlarının toplamı olarak yazılması demektir.
0.6875 = 6x10-1 + 8x10-2 + 7x10-3 + 5x10-4
= 6/101 + 8/102 + 7/103 + 5/104
= 6/10 + 8/100 + 7/1000 + 5/10000
olur.
Örnek. 0.317 sayısının 10 lu sayıtlama dizgesindeki açılımını yazınız.
0.317 = 3x10-1 + 1x10-2 + 7x10-3
= 3/101 + 1/102 + 7/103
= 3/10 + 1/100 + 7/1000
Örnek. 2317.52 sayısının 10 lu sayıtlama dizgesindeki açılımını yazınız.
2317.52 = 2x10 3 + 3x10 2 + 1x10 1 + 7x10 0 + 5x10 -1 + 2x10 -2
= 2x1000 + 3x100 + 1x10 + 7x1 + 5/10 + 2/100
2 Tabanlı (2 li, binary) Sayıtlama Dizgesi
Sayısal (digital) bilgisayarlar ise İkili Sayıtlama Dizgesini kullanır. İkili Sayıtlama Dizgesi 2 tabanlı dizgedir; yalnızca 0 ile 1 sayaklarını kullanır. Bu dizgedeki hanelere İngilizce’de bit denilir. Bu sözcük, Binary digIT deyiminden türetilmiştir. Bilgisayarın elektronik devrelerinde 0 bit’i alçak voltaj, 1 bit’i ise yüksek voltaj ile temsil edilir.
İkili Sayıtlama Dizgesi’nin yapısı onlu sayıtlama dizgesi gibidir; yani sayılar bitlerin yer aldığı haneye göre değer alır. Bunu daha iyi anlamak için, herhangi bir sayının onlu sayıtlama dizgesindeki yazılışını anımsayalım.
10 un kuvvetleri |
103 |
102 |
101 |
100 |
Hane değeri |
1000 |
100 |
10 |
1 |
2718 |
2x103 |
7x102 |
1x101 |
8x100 |
2718 |
2000 |
700 |
10 |
8 |
olur. Aynı işi, 10 nun kuvvetleri yerine, 2 nin kuvvetlerini kullanarak yapalım.
2k |
211 |
210 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
|
2048 |
1024 |
512 |
256 |
128 |
64 |
32 |
16 |
8 |
4 |
2 |
1 |
2718 |
1x211 |
0x210 |
1x29 |
0x28 |
1x27 |
0x26 |
0x25 |
1x24 |
1x23 |
1x22 |
1x21 |
0x20 |
2718 |
2048 |
0 |
512 |
0 |
128 |
0 |
0 |
16 |
8 |
4 |
2 |
0 |
O halde, 2718 sayısının 2 tabanına göre açılımını yazarsak
(101010011110)2 = 1x211 + 0x210 + 1x29 + 0x28 + 1x27 + 0x26 + 0x25 + 1x24 + 1x23 + 1x22 + 1x21 + 0x20
= 2048 + 512 + 128 + 16 + 8 + 4 + 2
= 271810
olacaktır. Görüldüğü gibi, onlu sayıtlama dizgesinde yapıldığı gibi 2 li sayıtlama dizgesinde de sayakların basamak değerleri (place value) vardır. Bunları sağdan sola doğru sıralarsak
1 ler basamağı,
2 ler basamağı,
4 ler basamağı
8 ler basamağı,
16 lar basamağı,
32 ler basamağı,
64 ler basamağı,
128 ler basamağı,
256 lar basamağı,
512 ler basamağı,
1024 ler basamağı,
2048 ler basamağı,
...
olacaktır. Bu yöntemle bütün doğal sayıları yazabileceğimiz açıktır.
Örnek. 11022 sayısının açılımını yazınız.
11022 = 1x23 + 1x22 + 0x21 + 1x20
= 1x8 + 1x4 + 0x2 + 1x1
= 8 + 4 + 0 + 1
= 1310
Kesirli sayıların ikili sayıtlama dizgesindeki temsillerini açıklayabilmek için, önce (0,1) aralığındaki sayıları 10-lu sayıtlama dizgesinde nasıl yazdığımızı anımsayalım.
Örnek. 0.01012 sayısının açılımını yazınız.
0.01012 = 0x2-1 + 1x2-2 + 0x2-3 + 1x2-4
= 0/2 + 1/4 + 0/8 + 1/16
= (5/16)10
Bir tabana göre yazılmış bir sayıyı başka bir tabana göre yazmak için, sayının istenen tabana göre açılımını yazmak yetecektir. Bunu bazı örneklerle açıklayalım.
10 tabanına göre yazılmış bir sayıyı 2 tabanına dönüştürmek için, verilen sayıda 2 nin hangi kuvvetlerinin kaçar tane bulunduğunu saptanıp, 2 nin artan kuvvetlerine göre açılımı yazmak yetecektir.
a. Verilen sayı tamsayı ise
Sayıyı 2 ye bölüp kalanı saptamak ve sonra bölüm için aynı işi yaparak bölüm 0 oluncaya kadar bu işe devam etmek gerekir. Birinci adımda kalan 1 ler hanesine, ikinci adımdaki kalan 2 ler hanesine, üçüncü adımdaki kalan 4 ler hanesine vb. yazılır.
Örnek. 7110 sayısını 2 tabanına göre yazınız.
71 : 2 = 35 1
35 : 2 = 17 1
17 : 2 = 8 1
8 : 2 = 4 0
4 : 2 = 2 0
2 : 2 = 1 0
1 : 2 = 0 1
Ohalde 7110 = (1000111)2 dir.
b. Verilen sayı kesirli sayı ise
Kesirli sayıları yazmak için (0,1) aralığındaki sayıları 10-lu sayıtlama dizgesinde nasıl yazdığımızı anımsayalım ve ikili dizgede benzer usavurmayı yapalım.
Sayıyı 2 ile çarpar, çarpımın tam kısmını ayırırız. Kalan kesri tekrar 2 ile çarpar, çarpımın tam kısmını ayırırız. Aynı işleme, kesirli kısım 0 oluncaya kadar ya da yeterince ardışık işlem yaparak istenen yaklaşık sayı bulununcaya kadar devam etmek gerekir. Birinci adımdaki tam kısım ½ ler hanesine, ikinci adımdaki tam kısım ¼ ler hanesine, üçüncü adımdaki tam kısım 1/8 ler hanesine vb. Yazılır.
1.Durum: Kesirli sayı 2 nin negatif kuvvetlernin sonlui toplamı olarak yazılabiliyorsa.
2 li sayıtlama dizgesinde de aynı yöntem kullanılır. Yukarıdaki 0.6875 sayısını 2 tabanına göre yazmak için, bu sayı içinde kaç tane 1/2, kaç tane 1/2 2 , kaç tane 1/2 3 , kaç tane 1/2 4 , kaç tane 1/2 5 ...vb olduğunu bulmalıyız.
0.6875 = 1x2 -1 + 0x2 -2 + 1x2 -3 + 1x2 -4
= 1x(1/2) + 0x(1/4) + 1x(1/8) + 1x(1/16)
= (1011)2
2.Durum: Kesirli sayı 2 nin negatif kuvvetleri toplamı olarak yazılamıyorsa.
Örnek. (0.317)10 sayısını 2 tabanına göre yazınız.
0.317 x 2 = 0.634 0
0.634 x 2 = 1.268 1
0.268 x 2 = 0.536 0
0.536 x 2 = 1.072 1
0.072 x 2 = 0.144 0
0.144 x 2 = 0.288 0
0.288 x 2 = 0.576 0
0.576 x 2 = 1.152 1
0.152 x 2 = 0.304 0
... ...
Ohalde (0.317)10 @ (0.010100010...)2 dir.
Bu kez, sayıyı 2-n nin katlarının sonlu toplamı şeklinde yazamadığımızı görüyoruz. Bu, 10 lu dizgede sonsuz ondalıklı temsillere benzer. Bu durumda, yeterince basamak yazarak, asıl sayıya istediğimiz kadar yakın 2 li bir temsil elde edebiliriz.
Örnek. (0.7215)10 sayısını 2 tabanına göre yazınız.
0.7215 x 2 = 1.4430 1
0.4430 x 2 = 0.8860 0
0.8860 x 2 = 1.7720 1
0.7720 x 2 = 1.5440 1
0.5440 x 2 = 1.0880 1
0.0880 x 2 = 0.1760 0
0.1760 x 2 = 1.3520 0
0.3520 x 2 = 0.7040 0
0.7040 x 2 = 1.4080 1
Ohalde (0.7215)10 @ (0.101110001)2 dir.
Sayının tam ve kesirli kısımları varsa, tam ve kesirli kısımlar ayrı ayrı dönüştürülür ve sonra ikisi birleştirilir.
Örnek. (41.6875)10 sayısını 2 tabanına göre yazınız.
41 : 2 = 20 1
20 : 2 = 10 0
10 : 2 = 5 0
5 : 2 = 2 1
2 : 2 = 1 0
1 : 2 = 0 1
Ohalde 4110 = (101001)2 dir. Öte yandan,
0.6875 x 2 = 1.3750 1
0.3750 x 2 = 0.7500 0
0.7500 x 2 = 1.5000 1
0.5000 x 2 = 1.0000 1
Ohalde (41.7215)10 @ (101001.1011)2 dir.
İkiliden onluya dönüşüm
2 tabanına göre yazılmış bir sayıyı 10 tabanına göre yazmak için, 2 tabanına göre açılımını yazar ve ortaya çıkan terimleri toplarız.
Örnek (1010.011) 2 = 1x23 + 0x22 + 1x21 + 0x2-1 + 1x2-2 + 1x2-3
= 23 + 21 + 2-2 + 2-3
= (10.375)10
Sekizliden onluya dönüşüm
Örnek (630.4) 8 = 6x82 + 3x81 + 4x8-1 + 0x2-1 + 1x2-2 + 1x2-3
= 23 + 21 + 2-2 + 2-3
= (10.375)10
Onlu dizgeden sekizli dizgeye dönüşüm
Örnek (153)10 sayısını sekizli dizgeye dödüştürünüz.
153 : 8 = 19 1
19 : 8 = 2 3
2 : 8 = 0 2
Ohalde
(153)10 = (231)8
dir.
Örnek (0.513)10 sayısını sekizli dizgeye dödüştürünüz.
0.513 x 8 = 4.104 4
0.104 x 8 = 0.832 0
0.832 x 8 = 6.656 6
0.656 x 8 = 5.248 5
0.248 x 8 = 1.984 1
0.984 x 8 = 7.782 7
... ...
Ohalde (0.512)10 @ (0.406517...)8 dir. Bu sonuç virgülden sonraki 7 basamağa kadar duyarlıdır. İşlem yürütülerek istenen ince duyarlık sağlanabilir.
r tabanlı gösterimden onlu gösterime dönüşüm
Verilen sayının r tabanına göre açılımı yazılır ve ortaya çıkan terimler toplanır.
İkili sayıtlama dizgesinde dört işlem, aynen onlu dizgede olduğu gibi yapılır.
0 0 1 00111011 59
0 1 1 00101010 42
+____ +______ +_____ +___________ +_______
0 1 10 01101010 101
0 1 1 0 01010101 85
0 1 0 1 00111001 57
-____ -______ -_____ -_____ -___________ -_____
0 0 1 -1 00011100 28
0 1 1 0 1101 13
0 1 0 1 101 5
x____ x______ x_____ x_____ x___________ x_____
0 1 1 0 1101 65
0000
1101
+___________
1000001
110111 101
________
101 1011
00111
101
-______
0101
101
-_______
000
2 ler Tümleyenleriyle Aritmetik
İkili sayıtlama dizgesinde elle yapılan dört işlemi onlu dizgedekine benzer olarak yapabiliyoruz. Ancak, mikrobilgisayarlarda çıkarma işlemini yapacak devre yoktur; devreler tümleme (complement, negation) ve artırma (increment, 1 ekleme) işlemlerini yapabilir. Dolayısıyla çıkarma işlemini veya daha genel olarak işaretli sayılarda aritmetik işlemlerini yaparken, negatif sayıların 2 ler tümleyenlerini kullanırlar. Bunun yanında, çoğu mikrobilgisayarlarda dört işlemi hızlı yapacak özel devreler vardır.
Mikrobilgisayarlarda toplama ve çıkarma işlemlerinin nasıl yapıldığını daha iyi anlamak için 8-bitlik yazmaca (register) sahip bir mikroilgisayarda işaretli sayıların nasıl yazıldığını inceleyelim.
8-bitlik bir yazmaçta (register), haneler sağdan sola doğru
7 6 5 4 3 2 1 0
|
|
|
|
|
|
|
|
diye numaralansın. 7-inci hane işaret hanesidir. Pozitif sayılar için 0, negatif sayılar için 1 değerini alır. Buna göre, 8-bitlik bir yazmaca sığabilecek en büyük pozitif tamsayı
0111 1111 = 26 + 25 + 24 +23 + 22 + 21 + 20 = 64 + 32 + 16 + 8 + 4 + 2 + 1 = +127
dir. İşaretli sayıların 8-bitlik bir yazmaçta temsil edilme biçimleri aşağıdaki tabloda gösterilmiştir. Pozitif sayılar olduğu gibi yazılır, negatif sayılar 2ler tümleyen biçimleriyle yazılır.
Decimal |
Yazmaçtaki Temsili |
Açıklama |
|
+127 |
0111 1111 |
İkili Temsil |
|
+126 |
0111 1110 |
İkili Temsil |
|
… |
… |
… |
|
+8 |
0000 1000 |
İkili Temsil |
|
+7 |
0000 0111 |
İkili Temsil |
|
+6 |
0000 0110 |
İkili Temsil |
|
+5 |
0000 0101 |
İkili Temsil |
|
+4 |
0000 0100 |
İkili Temsil |
|
+3 |
0000 0011 |
İkili Temsil |
|
+2 |
0000 0010 |
İkili Temsil |
|
+1 |
0000 0001 |
İkili Temsil |
|
+0 |
0000 0000 |
İkili Temsil |
|
-1 |
1111 1111 |
2ler Tümleyeni |
|
-2 |
1111 1110 |
2ler Tümleyeni |
|
-3 |
1111 1101 |
2ler Tümleyeni |
|
-4 |
1111 1100 |
2ler Tümleyeni |
|
-5 |
1111 1011 |
2ler Tümleyeni |
|
-6 |
1111 1010 |
2ler Tümleyeni |
|
-7 |
1111 1001 |
2ler Tümleyeni |
|
-8 |
1111 1000 |
2ler Tümleyeni |
|
… |
… |
… |
|
-127 |
1000 0001 |
2ler Tümleyeni |
|
-128 |
1000 0000 |
2ler Tümleyeni |
|
Bu tabloyu kullanarak, çıkarma işlemini, çıkan sayının 2 lere tümleyeniyle toplama işlemine dönüştürebiliriz. Böylece, çıkarma işlemini yapan devrenin olmayışının yarattığı eksiklik kolayca giderilmiş olur.
Örnek 1.
+5 0000 0101
+3 0000 0011
+_________ +_____________
+8 0000 1000
Örnek 2.
+7 0000 0111
-3 1111 1101
+_________ +_______________
+4 1 0000 0100
İkili temsilde yazmacı taşan en soldaki 1 sayağı atılır.
Örnek 3.
+3 0000 0011
-8 1111 1000
+_________ +_______________
-5 1111 1011
Örnek 4.
-2 1111 1110
-5 1111 1011
+_________ +_______________
-7 1 1111 1001
İkili temsilde yazmacı taşan en soldaki 1 sayağı atılır.
Örnek 5.
+8 0000 1000
- 5 1111 1011
+_________ +_______________
+3 1 0000 0011
İkili temsilde yazmacı taşan en soldaki 1 sayağı atılır.
Örnek 6.
+2 0000 0010
-6 1111 1010
+_________ +_______________
-4 1 1111 1100
İkili temsilde yazmacı taşan en soldaki 1 sayağı atılır.
Örnek 7.
+89 0101 1001
- 46 1101 0010
+_________ +_______________
+4 1 0010 1011
İkili temsilde yazmacı taşan en soldaki 1 sayağı atılır.
Örnek 8.
+20 0001 0100
- 60 1100 0100
+_________ +_______________
- 40 1 1101 1000
İkili temsilde yazmacı taşan en soldaki 1 sayağı atılır.
Aşağıdaki tabloda sayıtlama dizgelerinin sayakları listelenmiştir.
Hexadecimal Decimal Octal Binary |
|
0 0 0 0000 |
1 1 1 0001 |
2 2 2 0010 |
3 3 3 0011 |
4 4 4 0100 |
5 5 5 0101 |
6 6 6 0110 |
7 7 7 0111 |
8 8 10 1000 |
9 9 11 1001 |
A 10 12 1010 |
B 11 13 1011 |
C 12 14 1100 |
D 13 15 1101 |
E 14 16 1110 |
F 15 17 1111 |
Sayıtlama Dizgelerinin Karşılaştırılması
Octal ve hexadecimal sayıları binary gösterimlerinde kolay okuyup yazmak için onları, sırasıyla 3-erli ve 4-erli gruplara ayırmak uygun olur.
Örnek 1.
Octal dizgedeki (6754)8 sayısının binary temsili 110111101100 dir. Bunu kolay yazmak için, binary temsilini, sağdan başlayarak 3-erli gruplara ayıralım.
110 111 101 100 = 67548 |
6 7 5 4 |
olur.
Örnek 2.
Hexadecimal dizgedeki (DEC)16 sayısının binary temsili 110111101100 dır. Bunu kolay yazmak için, binary temsilini, sağdan başlayarak 4-erli gruplara ayıralım.
1101 1110 1100 = DEC16 |
D E C |
olur.
Sekizli (octal) ve onaltılı (hexadecimal) sayıların gösterimi
23 = 8 ve 24 = 16 olduğu ve ana bellekte adres büyüklükleri 8 ya da 16 bit’ten oluştuğu zaman, sekizli ve onaltılı sayıların ikiliye dönüşümü ve ikiliden bunlara dönüşüm pratik bir rol oynar.
Bu dönüşümü kolaylaştırmak için, sayıların ikili gösterimlerini, sırasıyla, 3 erli ve 4 erli hanelere ayırmak uygun olur.
Örnek.
(26153.7406) 8 = ( 10 110 001 101 011 . 111 100 000 110 ) 2 |
2 6 1 5 3 . 7 4 0 6 |
Örnek. İkiliden onaltılıya dönüşüm.
( 10 1100 0110 1011 . 1111 0010 )2 = ( 2C6B.F2 )16 |
2 C 6 B . F 2 |
Örnek. Sekizliden ikiliye dönüşüm.
( 673.124 ) 8 = ( 110 111 011 001 . 001 010 100 ) 2 |
6 7 3 1 . 1 2 4 |
Örnek. Onaltılıdan ikiliye dönüşüm.
( 306.D )16 = ( 0011 0000 0110 . 1101 ) 2 |
3 0 6 . D |
BCD Sayıları
Dönüşüm kolaylığı nedeniyle, binary sayılar, çoğu kez, hexadecimal dizgede temsil edilirler. Binary temsilden decimal temsile dönüşüm uzun işlemler gerektirir. Bu nedenle, dönüşümü kolaylaştıran bir kodlama dizgesi kullanılır. Adına BCD (Binary Coded Decimal) denilen bu dönüşüm tablosu aşağıda verilmiştir. En yaygın kullanılanılanı 8421 BCD Kodlama Tablosudur.
8421 BCD Kodlama Tablosu
Decimal |
BCD |
|
8 ler |
4 ler |
2 ler |
1 ler |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
2 |
0 |
0 |
1 |
0 |
3 |
0 |
0 |
1 |
1 |
4 |
0 |
1 |
0 |
0 |
5 |
0 |
1 |
0 |
1 |
6 |
0 |
1 |
1 |
0 |
7 |
0 |
1 |
1 |
1 |
8 |
1 |
0 |
0 |
0 |
9 |
1 |
0 |
0 |
1 |
Örnek 1
Yukarıdaki tabloyu kullanarak 3691 sayısını decimalden BCD ye dönüştürünüz.
3 6 9 1
0011 0110 1001 0001
Örnek 2
Yukarıdaki tabloyu kullanarak 1000 0000 0111 0010 sayısını BCD den decimale dönüştürünüz.
0011 0110 1001 0001
8 0 7 2
Alıştırmalar
1. Aşağıda 10-lu dizgeden BCD ye yapılan dönüşümlerin doğruluğunu sağlayınız.
a. 39 = 0011 1001 b. 40 = 0100 0000 c. 82 = 1000 0010
d. 65 = 0110 0101 e. 17 = 0001 0111 f. 99 = 1001 1001
2. Aşağıda BCD den 10-lu dizgeye yapılan dönüşümlerin doğruluğunu sağlayınız.
a. 1000 0000 = 80 b. 1001 0010 = 92 c. 0100 0011 = 43
d. 0000 0001 = 1 e. 0111 0110 = 76 f. 0101 0101 = 55