none
C# girilen decimal sayıyı bcd koda çevirme RRS feed

  • Soru

  • Bugün derste hocamız bunu yapmamızı istedi, ben bunu çok boyutlu diziler ile yaptım ama böyle istemiyorum internetteki örnekler gibi yapmak istiyorum nasıl yapabilirim ve yapanınız hiç varmı acaba ?

    örnek : 326 = 0011 0010 0110 çıktısı olucak
    • Taşıyan Serkan Canseven 19 Kasım 2015 Perşembe 15:19 (Gönderen: Konudışı)
    18 Kasım 2015 Çarşamba 15:11

Yanıtlar

  • Neyse, ben seni daha fazla zorlamayacagim, kendi sorularima kendim cevap vererek sana anlatayim :)

    Sen 2 boyutlu bir dizi yapmissin,  ilk elemani 0, 1, 2 ... nin string sekli. Dizilerin indexi 0'dan baslayip 1,2, .... diye gittigine gore bu ilk eleman gereksiz. Soyle olabilirdi dogrudan:

      string[] replaceBCD = {
        "0000", "0001", "0010", "0011",
        "0100", "0101", "0110", "0111",
        "1000", "1001", "1010", "1011",
        "1100", "1101", "1110", "1111" };
    
    //  //ya da:
    //  string[] replaceBCD = new string[16];
    //  replaceBCD[0] = "0000";
    //  replaceBCD[1] = "0001";
    //  //...

    Dikkat edersen bu sekilde her rakamin karsiligi binary olarak var. Yine dikkat edersen, her bir 4 binary rakamdan olusan bloklara alabilecekleri her turlu degeri sirasiyla yazinca tum degerleri elde ettik ve sonucta replaceBCD'nin 10 degil 16 "rakami" var.

    Acaba hocaniz daha size anlatmadi mi, bu base 16 ya da hex rakamlari ( 0, 1, 2... 9, A, B, C, D, E, F ). Her 32 bit integer = 4 byte = 2 * 4 hex rakamdan olusur. Byte'in her bir hex rakamina half byte ya da "nibble" denir ve yukaridaki binary 4'lu bloklari olusturur. Buraya kadar anladiysan, senin hatan:

    326'da sen bunlari tek tek alip 3 = 0011, 2 = 0010, 6 = 0110 diye dusunuyorsun.  Oysa 326 sayisi hex olarak memoryde  0146 olarak saklanir. Yani once hex'e cevirip ondan sonra 1 = 0001, 4 = 0010, 6 = 0110 yapsaydin olacakti. replaceBCD'nin yukaridaki orneginden senin 'nibble'lari bulup decimale (10'luk sistem) cevirirsen:

    0011 0010 0110

    0110 = 6 (hex) = 6 (decimal)
    0010 = 2 (hex) = 2 * 16 = 32 (decimal)
    0011 = 3 (hex) = 3 * 16 * 16 = 3 * 256 = 768 (decimal)

    326 (hex) = 6 + 32 + 768 = 806 decimal

    Umarim simdi anlamissindir olayi. Simdi de sana kodla cozum yollarindan birisini vereyim, kodu anlamaya calis, anlamadigin kismi varsa sor:

    void Main()
    {
      string[] nibbles = new string[16];
      for (int i = 0; i < 16; i++)
      {
        nibbles[i] = Convert.ToString(i,2).PadLeft(4,'0');
        Console.WriteLine(nibbles[i]);
      }
      
      var sayi = 326;
      
      string[] parts = new string[8];
      for (int i = 0; i < 8; i++)
      {
        parts[8-i-1] = nibbles[(sayi >> (i*4) & 0xF)];
        //Console.WriteLine(nibbles[(sayi >> (i*4) & 0xF)]);
      }
      Console.WriteLine(string.Join(" ", parts));
    }
    

     

     

    19 Kasım 2015 Perşembe 14:23
    Yanıtlayıcı

Tüm Yanıtlar

  • Herhalde hocaniz 326'dan nasil 0011 0010 0110 cikmayacagini anlatmak istemistir.

    Console.WriteLine( Convert.ToString(326, 2) );

    18 Kasım 2015 Çarşamba 21:17
    Yanıtlayıcı
  • Herhalde hocaniz 326'dan nasil 0011 0010 0110 cikmayacagini anlatmak istemistir.

    Console.WriteLine( Convert.ToString(326, 2) );

    Hocam bilgilendirme için teşekkürler 1 saat nerdeyse araştırdım cevabını ToString ile çözüleceği hiç aklıma gelmemişti.


    kdrgny@outlook.com

    18 Kasım 2015 Çarşamba 21:30
  • Deleted
    18 Kasım 2015 Çarşamba 21:48
  • Haksiz da degilsiniz aslinda. Bu milenyumda cikan diger dillerde bu is cok kolayken, nedense .Net'de hala en akla gelmeyecek yerde, Convert.ToString ile :)
    18 Kasım 2015 Çarşamba 22:31
    Yanıtlayıcı
  • hocam oradaki 2lik taban mi gosteriyor ? istedigimiz taban cevire biliriz ?


    Agha Huseynov

    18 Kasım 2015 Çarşamba 22:53
  • Evet. 2,8,10 ve 16 sadece.


    18 Kasım 2015 Çarşamba 23:02
    Yanıtlayıcı
  • yok hocam dediğim gibi hatta biizim dersimiz çarşamba günü yapamayanlar haftaya yapıcam dedi 1 hafta daha süre size dedi binary to bcd sonrada binary to gray 2sinide yapıcak 

    benim yaptığımı göstereyim size;

    binary to BCD

    18 Kasım 2015 Çarşamba 23:06
  • Benim dedigim 326 = 0011 0010 0110 olacak demen sacma, nereden 0011 0010 0110 degerini buldun idi. Yukarida da basit cevabi var.

    Anladigim kadariyla "cok boyutlu dizilerle" yapamamissin. Senin dizi ile yapma girisimin hatali, onu mu soruyorsun? 

    Kodu kopyala yapistir yapmaktansa ekranin resmini cekip eklemek gibi bir sey, diziyle bu sekilde cozme girisimi. Diziyle cozmek istersen:

    1) Dizinin 2 boyutlu olmasi gereksiz - neden?

    2) Dizinin elemanlari eksik (ya da fazla) - neden?

    Bu sorulara cevap vermekle basla. Yok ben diziyle cozmek istiyorum ve cevaplari bulamiyorum dersen bakalim :)

    19 Kasım 2015 Perşembe 11:02
    Yanıtlayıcı
  • Hocam şimdi beni yanlış alıyorsunuz her seferde 
    1. si biz bu kodu temel elektronik dersinde yazdık elektronik diye bende bilgisayarımı götürmüyodum. Kodu okulun bilgisyarında yazdım fotoyu telefonumla çektim ki kodda gayet çalışıyor 326 girildiğinde 001100100110 olarakta çıkıyor
    19 Kasım 2015 Perşembe 12:08
  • Tamam o zaman bana anlat nasil oluyor da 326nin karsiligi 001100100110 cikiyor. Benim bildigim "001100100110" = 806. 

    Elektronik devrelerde 0 ve 1 degerleri oldukca onemli ve siz 326'dan bu 0,1 serisini cikarabiliyorsaniz nasil oldugunu ogrenmek isterim ben de. Ikimizden birisi yanlis biliyor. Nasil hesapladiginizi gosterin en iyisi. Ben elime kagit kalem alarak yaparsam, en sagdan basliyorum (2^0 * 0) + (2^1 * 1) + ... diye yapiyorum. Ya da basitce kodla:

    Convert.ToInt32("001100100110", 2)
    326 cikmiyor. 326'yi cevirirsem de bu cikmiyor.

    Not: Ben nasil 326'dan bunu cikarmayi basardigini gordum de, yaptigin hata sana sordugum 2 soruda gizli.
    19 Kasım 2015 Perşembe 13:38
    Yanıtlayıcı
  • Neyse, ben seni daha fazla zorlamayacagim, kendi sorularima kendim cevap vererek sana anlatayim :)

    Sen 2 boyutlu bir dizi yapmissin,  ilk elemani 0, 1, 2 ... nin string sekli. Dizilerin indexi 0'dan baslayip 1,2, .... diye gittigine gore bu ilk eleman gereksiz. Soyle olabilirdi dogrudan:

      string[] replaceBCD = {
        "0000", "0001", "0010", "0011",
        "0100", "0101", "0110", "0111",
        "1000", "1001", "1010", "1011",
        "1100", "1101", "1110", "1111" };
    
    //  //ya da:
    //  string[] replaceBCD = new string[16];
    //  replaceBCD[0] = "0000";
    //  replaceBCD[1] = "0001";
    //  //...

    Dikkat edersen bu sekilde her rakamin karsiligi binary olarak var. Yine dikkat edersen, her bir 4 binary rakamdan olusan bloklara alabilecekleri her turlu degeri sirasiyla yazinca tum degerleri elde ettik ve sonucta replaceBCD'nin 10 degil 16 "rakami" var.

    Acaba hocaniz daha size anlatmadi mi, bu base 16 ya da hex rakamlari ( 0, 1, 2... 9, A, B, C, D, E, F ). Her 32 bit integer = 4 byte = 2 * 4 hex rakamdan olusur. Byte'in her bir hex rakamina half byte ya da "nibble" denir ve yukaridaki binary 4'lu bloklari olusturur. Buraya kadar anladiysan, senin hatan:

    326'da sen bunlari tek tek alip 3 = 0011, 2 = 0010, 6 = 0110 diye dusunuyorsun.  Oysa 326 sayisi hex olarak memoryde  0146 olarak saklanir. Yani once hex'e cevirip ondan sonra 1 = 0001, 4 = 0010, 6 = 0110 yapsaydin olacakti. replaceBCD'nin yukaridaki orneginden senin 'nibble'lari bulup decimale (10'luk sistem) cevirirsen:

    0011 0010 0110

    0110 = 6 (hex) = 6 (decimal)
    0010 = 2 (hex) = 2 * 16 = 32 (decimal)
    0011 = 3 (hex) = 3 * 16 * 16 = 3 * 256 = 768 (decimal)

    326 (hex) = 6 + 32 + 768 = 806 decimal

    Umarim simdi anlamissindir olayi. Simdi de sana kodla cozum yollarindan birisini vereyim, kodu anlamaya calis, anlamadigin kismi varsa sor:

    void Main()
    {
      string[] nibbles = new string[16];
      for (int i = 0; i < 16; i++)
      {
        nibbles[i] = Convert.ToString(i,2).PadLeft(4,'0');
        Console.WriteLine(nibbles[i]);
      }
      
      var sayi = 326;
      
      string[] parts = new string[8];
      for (int i = 0; i < 8; i++)
      {
        parts[8-i-1] = nibbles[(sayi >> (i*4) & 0xF)];
        //Console.WriteLine(nibbles[(sayi >> (i*4) & 0xF)]);
      }
      Console.WriteLine(string.Join(" ", parts));
    }
    

     

     

    19 Kasım 2015 Perşembe 14:23
    Yanıtlayıcı
  • https://tr.wikipedia.org/wiki/BCD_kodu
    hocam misal 326 sayısı = 3-->(0011) 2-->(0010) 6-->(0110) 326 sayısı
    vikipedide gösterdiğine göre sıkıştırılmış oluyor benimki
    19 Kasım 2015 Perşembe 17:40
  • string.Join("", 326.ToString().Select(p=>  Convert.ToString(int.Parse(p.ToString()), 2).PadLeft(4,'0')));

    int to bcd

    biz BCD'yi cihazlar arasında sayıları byte dizisi içine kolayca taşıma için kullanıyoruz. Piyasada gördüğünüz yazar kasaların nerdeyse hepsi veriyi BCD biçiminde iletir.

    Hocanız bundan sonra CRC soracaktır haberin olsun onuda araştırmaya başlasan iyi olur :)

    Ha TCP/IP icad olmuş ne gerek var BCD CRC falan diyorsanız o ayrı konu :P


    www.mvcblog.org
    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com





    19 Kasım 2015 Perşembe 19:21
    Moderatör
  • Evet haklisin, benim anladigim o degilmis. O zaman verdigim ornekte 16 degil 10 rakam kullan. 
    20 Kasım 2015 Cuma 09:44
    Yanıtlayıcı
  • Yardımlarınız için teşekkürler hocam :)
    20 Kasım 2015 Cuma 11:01
  • işte BCD ile Gray kodu sordu bakalım haftaya ne sorucak kaynak linkiniz varsa atabilirmisiniz acaba ?

    bu arada linq yapmışsınızda ben bilmiyorum ya daha anlaşılır bir şekilde yazabilirmisiniz ?
    20 Kasım 2015 Cuma 11:01
  • Linq yerine:

    void Main()
    {
      string[] replaceBCD = {
        "0000", "0001", "0010", "0011",
        "0100", "0101", "0110", "0111",
        "1000", "1001" };
      
      var number = 326;
      
      var nStr = number.ToString();
      var sb = new StringBuilder();
      
      for (int i = 0; i < nStr.Length; i++)
      {
        sb.AppendFormat("{0} ", replaceBCD[ int.Parse(nStr[i].ToString()) ] );
      }
      var sonuc = sb.ToString().Trim();
      Console.WriteLine ( sonuc );
    }
    

    20 Kasım 2015 Cuma 12:52
    Yanıtlayıcı