Büyük sayılar üzerinde 4 işlem

Nerdeyse 3 haftadır Nottingham’dayım. Mutluyum. Yazamıyorum =)

Genelde bütün boş zamanımı bu directx projesi yiyor. Ama dün ve önceki gün zaman ayırıp (aslında inada girip =D) integer sınırlarını taşacak sayılar üzerinde işlem yapmayı sağlayan bir kütüphane yazabildim. Neden böyle bir şey yaptın diye sorarsanız bir şey diyemem =)

Kullanımı basit, operator overloading eklemeyi denedim çalışıyor gibi. Ama ilk defa böyle bir şey yaptığım için ne kadar doğru bilmiyorum.

Nasıl çalıştığına gelince, sayıları bir karakter arrayi olarak tutuyor. Array in her elemanını bir basamak olarak düşünelim, yani 256 lık taban üzerinde çalışıyoruz 😀

Mesela toplama yapmak için

a b c d
e f g h +
———
1 2 3 4

önce sondan başlıyor, d+h i buluyor ve bir integer a atıyor. sonra bu integer ın son 8 bit ini (int&0xFF) sonuçta 4 numaralı byte a yazıyor. daha sonra bunu sağa 8bit shift ediyor ve kalanı bir sonraki basamağın toplanmasında kullanıyor. kalan bu durumda zaten en fazla 1 olabilir. sonra aynı işlemi cg bf ae için yapıyor ve sonucu buluyor.

çarpma işlemi biraz daha karışık. önce h ile d den başlayıp a b c d ile tek tek çarpıyor. yine aynı şekilde kalanı bir sonraki basamağa atıyor (bu sefer kalan 1 den fazla olabilir). sonra aynı şekilde g ile a b c d yi çarpıyor ve sonuca ekliyor. böyle giderek sonucu hesaplıyor.

bölme işlemi ise en zoru =D

a b c d
e

önce böleni aynı hizaya gelecek şekilde kaydırıyor

a b c d
e 0 0 0

eğer ilk sayı diğerinde büyük ise sayıyı çıkarıyor ve sonuçta o kısma gelen bit i 1 yapıyor. daha sonra e sayısı sağa 1 kez shift ediyor (tüm sayıyı, yani hex olarak 0x2F 00 00 00 ise sayı shift edince 0x17 80 00 00 oluyor) ve aynı işlemi tekrarlıyor. sonuçta bölümden geriye kalan sayı kalan oluyor ve sonuçta elde ettiğimizde bölüm oluyor.

kodumuz ve örnek program burada

Eklenecek daha çok şey var, integer sayılarını toplayabilme çıkarabilme desteği, onluk tabanda bastırabilme desteği vs… Aslında hepsini tasarladım ama koda dökmeye üşeniyorum. Kim bilir belki bi gün =)

Aslında Odtü yarışmasında beri aklımda idi bu proje, o zaman bu tip bir sistem yapmıştım ama o hexadecimal olarak değilde 10luk tabanda çalışıyordu o yüzden çok daha az performanslı idi ve ayrıca bölme işlemi yoktu =)