Aklıma gelen güzel bir soru.
A=1011 ataması ile A içine bin on bir değerini yüklemiş olun.
A değişkenine yanlışlıkla bin on bir atadığınızı aslında binary değer atmanız gerektiğini farkettiniz fakat iş işten geçti.
Şimdi amacımız A=13 değerini bulmak.
Sözkonusu hatayı düzelten algoritmayı bölme işlemi kullanmadan yazınız.
Yani 10100 gibi sayının binary olup olmadığını anlayabilen program gerekli öyle mi? Hem anlamakla kalmayacak düzeltecek.
Alıntı yapılan: t2 - 30 Mayıs 2011, 19:21:49
Yani 10100 gibi sayının binary olup olmadığını anlayabilen program gerekli öyle mi? Hem anlamakla kalmayacak düzeltecek.
Hayır yanlışmı değilmi anlamayacak. Zaten yanlış girilmiş olduğunu bildiği bu decimal sayıdan doğru binary değeri hesaplayacak.
if(A==1011)A=13; :D
ben algoritmayıda geçtim direk programı yazdım :D
RTRIM lerle bit değerleri alınır 1 ise hangi bit ise o değer toplam a ilave ettirilir(1-2-4-8-16.. ile çarpılıp toplama eklenir)
Alıntı yapılan: bunalmis - 30 Mayıs 2011, 19:01:17
Aklıma gelen güzel bir soru.
A=1011 ataması ile A içine bin on bir değerini yüklemiş olun.
A değişkenine yanlışlıkla bin on bir atadığınızı aslında binary değer atmanız gerektiğini farkettiniz fakat iş işten geçti.
Şimdi amacımız A=13 değerini bulmak.
Sözkonusu hatayı düzelten algoritmayı bölme işlemi kullanmadan yazınız.
Program bizim 13 mü 1011 mi yazmak istediğimizi nereden bilecek ?
Belki 1011 yazmak istedik ?
Yazılacabilecek 8 tane sayı var zaten bi switch case ile işlem tamam.
1000
1001
1010
1011
1100
1101
1110
1111
Ornek olsun diye sadece 4 bit verdim. Bu yuzden verilen basit cevaplar sayilmaz.
Allegroya da cevaben, verimizin en azindan 10 bitlik degere sahip oldugunu, bir baska deyisle yanlis olan sayimizin 10^10 mertebesinde oldugunu dusunun.
Benimkisi 128 bite kadar hesaplar ;D
Sorudan anladığım kadarıyla soru sadece 1011 için veya 4 bit için değil. soru aslında içinde 1 ve 0 dan farklı rakam bulunmayan herhangi bir tamsayının stringe çevirmek işleminin biraz değişik hali. Stringe çevirirken en sağdaki hücreye sayının 1. rakamının , solundakihücreye 2. rakamının .... ASCII kodunu atmak yerine bunu bir sayının bitlerine atma işleminin algoritması.
Bölme olsa çok kolay olurdu. Ama o zaman da bu soru anlamsız olurdu.
ilave:
bölme yok , kaydırma da yok anlamına mı geliyor?
2. ilave
sprintf ile sayının rakamlarını alıp bunları işlemek de yasaktır değil mi :P
Alıntı yapılan: The Gariban - 30 Mayıs 2011, 21:44:43
Benimkisi 128 bite kadar hesaplar ;D
dedigini kimse anlamadı çaktırmıyorlar :D
where is multimeter?hepimiz saskınız :D
Ya sinan hocam alemsin ama adam sanki "here is the spectrum Analyzer" der gibi diyordu. ;D
Bu arada sayın Bunalmış hocam Sözlü notlarımızı rica ediyoruz ben 95 bekliyorum ;D
Aslında her dilde bunu bir satırla yapan komutlar olmalı. Excel 2010 da bile varmış
http://www.officekullanimi.com/microsoft-office-excel/excel-de-onlu-tabandaki-bir-sayiyi-ikili-tabana-donusturme
söyleyeceğim yöntem belki de çok saçma olur, gençlik heyecanıma verin :)
hocam 3. sınıfta assembly almıştım ama assembly bilmiyorum fakat hatırladım kadarıyla rotate diye bir komut vardı,
öncelikle elimizdeki sayının rotate komutu ile kaç bit olduğunu saptamaya çalışırız, şöyle ki
A=1101;
bit=0;
B=ROTATE(A); // sırayla 1110, 0111, 1011, 1101
if(B!=A)
bit++; // bu örnekte bit=4 olur
bu şekilde sayının kaç bit olduğunu bulduk,
daha sonra elimizdeki bit sayısı kadar döngü kuruyoruz
burda sayıyı önce (bit-1) kadar sağa kaydırıyoruz ve sayının ilk rakamını elde ediyoruz, bu rakamı da 2^(bit-1) ile çarpıyoruz. bu örnekte 8 olur
sonra ilk rakam 1se(ki bit kaydırma ile işlemi ile yaptığımız çözümden bu kesinlikle 1 olacak) şu şekilde sayı oluşturuyoruz 10000...000(kaç bitse işte) bu örnekte 4 bit oluşturacağımız sayı 1000, esas sayımızdan bu sayıyı çıkarıyoruz yani 1101-1000=101 kaldı
şimdi bu sayıyı (bit-2) kadar sağa kaydırıyoruz ve esas sayının 2. rakamını elde ediyoruz, bu rakamı da yine 2^(bit-2) ile çarpıyoruz bu örnekte 4 olur.
eğer bu rakam 1 se bu sefer 100 sayısını oluşturuyoruz diğer sayıdan çıkarıyoruz 101-100=01 kalır elimizde,
eğer bu rakam 0 sa sayı oluşturmaya gerek yok 3. bit kaydırma işlemine geçeriz direk
sonra (bit-3) kadar sağa kaydırıyoruz, bu rakamı da yine 2^(bit-3) ile çarpıyoruz...
aynı şekilde işlemlere devam edince sonuçta 8+4+0+1=13 sayısnı elde etmiş oluruz.
örnek; A=110101 olsun.
bit=0;
B=ROTATE(A); //
if(B!=A)
bit++; burda bit=6 çıkar
5 kere sağa kaydırdık elimizde 1 var, 32*1=32
110101-100000=10101
4 kere sağa kaydırdık elimizde 1 var 16*1=16
10101-10000=0101
3 kere sağa kaydırdık elimizde 0 var 8*0=0
bu sefer sayı oluşturmuyoruz(0101 üzerinden devam)
2 kere sağa kaydırdık elimizde 1 var 4*1=4
0101-100=01 kaldı
1 kere sağa kaydırdık 0 geldi 2*0=0
0 geldiği için yine sayı oluşturmaya gerek yok(elimizde 01 var)
0 kere sağa kaydırma yaptık elimizde 1 var 1*1=1 geldi
32+16+0+4+0+1=53
naçizane fikrim bu şekilde hocam, çok basit gülünecek bir hata yaptıysam affınıza sığınırım
edit : 1111....11111 hariç diğer sayılar için uygun diye düşünüyorum
1011 tam sayisi 3F3 olarak saklanir.
O halde yazilacak algoritma 3f3 den B ye gecis yapmali.
Neyse kafa yorulsun diye sormustum.
Bolme yi basite kacilmasin diye yasakladim. Elbette ki cikartma ve kaydirma serbest.