Tühhh binary imiş

Başlatan bunalmis, 30 Mayıs 2011, 19:01:17

z

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.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

t2

#1
Yani 10100 gibi sayının binary olup olmadığını anlayabilen program gerekli öyle mi? Hem anlamakla kalmayacak düzeltecek.

z

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.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

satilla

#3
if(A==1011)A=13; :D

ben algoritmayıda geçtim direk programı yazdım :D

The Gariban

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)

Erol YILMAZ

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 ?

Erhan YILMAZ

Yazılacabilecek 8 tane sayı var zaten bi switch case ile işlem tamam.

1000
1001
1010
1011
1100
1101
1110
1111

z

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.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

The Gariban

Benimkisi 128 bite kadar hesaplar  ;D

Klein

#9
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

satilla

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

The Gariban

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
         

jackal183

#12
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


       

z

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.




Bana e^st de diyebilirsiniz.   www.cncdesigner.com