Yardım. 20 bitlik 20 Sayıyla uğraşmak

Başlatan vurkacoglu, 20 Aralık 2004, 20:52:17

vurkacoglu

Herkese selam arkadaşlar. Benim sorunum 20 bitlik 20 sayıyı toplamam gerekiyor. Yani sonuç en fazla 40 bit oluyor (yanlış hesaplamıyorsam).
div32 diye bi komut var ama o 32 bitlik sayılarla çalışmak için sanırım. gerçi onunda nasıl kullanıldığını tam olarak bilmiyorum. Bu işi nasıl yapacaz. bi fikri olan var mı? bir de şu div32 komutunun nasıl kullanıldığını hakkında açıklama yaparsanız çok makbule geçer. herkese teşekkürler.

ete

@vurkaçoğlu,

Öncelikle Pic Basic Pro'nu bu iş için uygun olmadığını belirtmekle söze başlamak istiyorum. Ancak yapacağın işe bağlı olarak yinede bir şeyler yapılabilir belki. Sana yol gösterecek bazı ip uçları vermek istiyorum.
Basic normalde 16 bit sayılarla çalışıyor. 16 bit demek HEX olarak en fazla FFFF yani 65535 rakamına kadar sayılar demektir. Bu rakamı geçen sayılariçin 32 bit hesaplamalar yapılabilir. 32 bitlik değeri bir değişkende göremezsin. Basic bunu ara değişkenlerde tutar ve DIV 32 ile kullandırır. Örnek verecek olursak;
A=47800
B= 235
c= A * B         ' sonuç 16 bitten büyük olacaktır
d= div32 100  'sonuç yani C değeri 100'e bölündü
Burda d değişkenine A ve B çarpımının 100'e bölümü yerleştirilir.
Div32 komutu 16 biti aşan hesabın hemen alt satırına yazılmalıdır. Arada başka bir ifade olmamalıdır.  Değişkenler word cinsinden olmalıdır.
Şimdi 24 bit bir sayının 8'er bit olarak nasıl hafızada tutulduğuna bakalım.
Sayımız Hex olarak A3B4C8 saysı olsun. Bunun desimal karşılığı bulunurken 8'er birlik A3 - B4 - C8 sayıları göz önünde bulundurulur.
Hex A3 =Desimal 163
Hex B4 = Desimal 180
Hex C7= Desimal 200  sayılarına eş değerdir.
Hesap yapılırken A3B4C8 sayısının desimal karşılığı
163 x 65536 + 180 x 256 + 200 = 10.748.648 olarak bulunur.
Sayı 32 bit olunca

A * 256*65536 + B * 65536 + C*256 + D şeklinde bir hesap yapmak gerekiyor. Tabiiki 32 veya 40 bitlik bir sayıyı toplama yaparak elde etmek zor basicte. Asembly de mümkün. Bunun için bit sayısına göre 3-4 kademeli bir düzen kurulup toplamaya başlanmalı ve her overflow olduğunda bir üst değişken değeri bir artırılmalı. Artırılan değişken overflow olduğunda onun üzerindeki bir artırılmalı şeklinde bir zincirleme hesp düzeneği.

Bilmem hala bu işi basicle yapmaya niyetlimisiniz ama bence gerçekten çok zor. Bu benim düşüncem tabiiki. Belki bazı arkadaşlar daha kolay bir yol önerebilirler. Bende merekla bekliyorum.

Kolay Gelsin
ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

vurkacoglu

Çok teşekkürler ETE.
Sanırım basicten vazgeçmek zorunda kalcam. peki bu işlemi C de yapabilirmiyim diye sorsam. assembler da yazmak için vaktim yok. Çünkü bu olay bitirme projesi için lazım ve bu hafta sonuna teslim var vazgeçmek gibi bi şansım yok yani. :(. gerçi C hakkında da hiç bir bilgim yok ama neyse. Peki JAL diye bişi var onda yapabilir miyiz :)
peki 20 bitlik 12 sayıyla uğraşsam bu da maksimum 32 bit yapar. olabilir mi?

mmengi

dostum 3 günde C nasıl öğrenilir bilemiyorum ama pbp den protona geçmen en fazla 1 günün alır ve orada 32 bitlik değişkenlerle istediğini yap en azından işini gör C ye gene geniş bir vakitte geç derim. Pbp de protonda birbirlerine çok yakındır hiç zorluk çekmezsin hatta öyle bir alışırsınki C ye bile ihtiyaç duymayabilirsin.  :)

vurkacoglu

Çok sağol  mmengi. ama benim derdim 32 bitlik değişkenlerle değil. benim 40 bite ihtiyacım var. bunun içinse floating point ( kayan nokta) hesabı yapabilen bir derleyiciye. neyse sorunu div32 ile halletmeye çalışıcam ama başaramazsam proton a geçerim. bu arada proton un kitabı var mı nette?

z

20 bitlik 20 sayinin toplamlari kac bittir?

Bir kac yoldan hesaplayabiliriz.

20 Bitlik en buyuk sayi sayi (2^20)-1 onluk sayisina esdegerdir.

Bu sayidan 20 tane olurssa 20 x [ (2^20)-1] olacaktir.

Bu sayinin kac bit olacagini bulursak n bit sayisi olmak uzere


n = log (20 x [ (2^20)-1] ) /log 2

n = 24.3

Sana 25 bit lik sonuc registeri fazlasiyla yetiyor bu durumda 32 bit komutlar senin isini goruyor.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

vurkacoglu

Alıntı yapılan: "bunalmis"20 bitlik 20 sayinin toplamlari kac bittir?

Bir kac yoldan hesaplayabiliriz.

20 Bitlik en buyuk sayi sayi (2^20)-1 onluk sayisina esdegerdir.

Bu sayidan 20 tane olurssa 20 x [ (2^20)-1] olacaktir.

Bu sayinin kac bit olacagini bulursak n bit sayisi olmak uzere


n = log (20 x [ (2^20)-1] ) /log 2

n = 24.3

Sana 25 bit lik sonuc registeri fazlasiyla yetiyor bu durumda 32 bit komutlar senin isini goruyor.

AFFEDERSİNİZ bunalmıs hocam çok haklısınız. ben çok büyük bir hata yaptım ve yaptığım hatanın farkına siz buraya bu satırları yazana kadar varamadım. evet 20 tane 20 bitlik sayının toplamı 40 bit eder diyen eşşek nerde çıksın ortaya :lol: herkesden özür dilerim.
peki bu 40 bit de nerden çıktı diyosanız yaptığım hata şu ben 20+20=21bit,
21+21=22bit, 22+22=23bit diye gitmeye başladım sonuç 40 bit eder dedim. nerden çıktı 40 bit anlamadım ki yaf :) neyse herkese büyük geçmiş olsun. tekrardan size teşekkür ediyorum bunalmıs üstadım sağolun. neyse napıyomuşuz hemen kendimize bi pro.ton kopyası buluyormuşuz. herkese iyi geceler.

mmengi

:)

Proton un içinden çıkan help i ve örnek dosyaları gerçekten yeterli ekstra başka bir şeye ihtiyacın olacağını sanmıyorum.

bsivgin

ASSAMBLY'de yazmayı dene derim... 20 tane sayı ram'de mi saklı?

Saygılarımla
Bülent ŞIVGIN

aster

Bayanlar Beyler, bu form da bir eksik form var sanki  :P
Matematik olabilirmi ?

vurkacoglu

sağolun arkadaşlar. aster haklı benim matematiğim olum olası zayıftı zaten. bir de algoritmalarda eksiğim var. ne de olsa daha yeni sayılırım bu işte zamanla olacak ama zaman yok :lol: benim dediğim şekilde bile toplama yapsak 39 bit yapıyo. bende bol buldum bitleri saçıyom. bayağı abartmışım insan bi düşünür 40 bit ne yapıyo diye.
(2^40)-1=1099511627775
picbasicte div32 ile halledilebilecek gibi duruyo. herkese tekrardan teşekürrler. kendinize iyi bakın.