logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C] Algorytm w C do konwersji liczby dziesiętnej na binarną lub dodawanie binarne

xysio_ 28 Lut 2009 22:27 9165 7
REKLAMA
  • #1 6219258
    xysio_
    Poziom 18  
    Posty: 352
    Pomógł: 5
    Ocena: 1
    witam wszystkich,
    potrzebuje możliwie najlżejszego algorytmu konwersji liczb dziesiątkowych na binarne, lub sposobu na dodawanie liczb binarnych
  • REKLAMA
  • #2 6219441
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    A po co chcesz konwertować? Komputer wszystko przechowuje i obrabia binarnie, a potem użytkownik wyświetla je w dowolnym systemie.
  • REKLAMA
  • #3 6220295
    ed-ek
    Poziom 34  
    Posty: 1814
    Pomógł: 275
    Ocena: 43
    Napisałem taki program konwersji decy na inny system. Możesz go sobie przerobić tylko na binarne
    
    #include <iostream>
    #include <conio.h>
    using namespace std;
     int reszta,liczba,i,j,k,wynik[20];
     const char tab[6]= {'A','B','C','D','E','F'};
     char ch;
      void bin(int);
      void oct(int);
      void hex(int);
     main()
     {
        cout<<"podaj liczbe do zamiany na inny kod ";
        cin>>liczba;   
       cout<<"podaj na jaki kod chcesz zamieniac "<<endl;
       cout<<"decymalny -> binarny press b"<<endl;     
       cout<<"decymalny -> oktalny press o"<<endl;
       cout<<"decymalny -> hexa press h"<<endl;
       cin>>ch;
       if(ch=='b' && liczba<2)cout<<"liczba w kodzie bin. =000"<<liczba;
       if(ch=='b' && liczba>1)bin(liczba);
       if(ch=='o' && liczba<8)cout<<"liczba w kodzie oct. =000"<<liczba;
       if(ch=='o' && liczba>7)oct(liczba);
       if(ch=='h' && liczba<10)cout<<"liczba w kodzie hex. =000"<<liczba;
       if(ch=='h' && liczba>9 && liczba<16)
       { int j=liczba-9;
         cout<<"liczba w kodzie hex. =0"<<tab[j-1];}
       if(ch=='h' && liczba>15)hex(liczba);
       getch();
    }
       void bin(int liczba)
       {
         i=0;  
         while (liczba>1)
         { 
            reszta=liczba % 2;    
            if(reszta>0)wynik[i]=reszta;
            liczba=liczba / 2;
            i=i+1;
            if(liczba<2)
            {wynik[i]=liczba;break;}
         }   
         cout<<"liczba w kodzie binarnym= "<<endl;
         for(int j=i;j>=0;j--)
          cout<<wynik[j]<<" ";
       }
    
       void oct(int liczba)
       {
          i=0;
          while(liczba>7)
          {
           reszta=liczba % 8;
           if(reszta>0)wynik[i]=reszta;
           liczba=liczba / 8;
           i=i+1;
           if(liczba <8)
           {wynik[i]=liczba;break;}               
            }   
                cout<<"liczba w kodzie octalnym= "<<endl; 
                   for(int j=i;j>=0;j--)
          cout<<wynik[j]<<" "; 
       }
       
         void hex(int liczba)
         {
             i=0; 
           while(liczba>15)
           {
            reszta=liczba % 16;
            if(reszta>0)wynik[i]=reszta;
            liczba=liczba / 16;
            i=i+1;
            if(liczba<16)
             {
              wynik[i]=liczba;break; }  
           }     
            cout<<"liczba w kodzie hexadecymalnym= "<<endl;      
               for(int j=i;j>=0;j--)
               {
                 if(wynik[j]<10) cout<<wynik[j];else
                  {
                    int k=wynik[j]-9;
                    cout<<tab[k-1];
                  }                   
            }                         
          }
    
  • #4 9530460
    radzio515
    Poziom 10  
    Posty: 10
    ed-ek napisał:
    Napisałem taki program konwersji decy na inny system. Możesz go sobie przerobić tylko na binarne
    
    #include <iostream>
    #include <conio.h>
    using namespace std;
     int reszta,liczba,i,j,k,wynik[20];
     const char tab[6]= {'A','B','C','D','E','F'};
     char ch;
      void bin(int);
      void oct(int);
      void hex(int);
     main()
     {
        cout<<"podaj liczbe do zamiany na inny kod ";
        cin>>liczba;   
       cout<<"podaj na jaki kod chcesz zamieniac "<<endl;
       cout<<"decymalny -> binarny press b"<<endl;     
       cout<<"decymalny -> oktalny press o"<<endl;
       cout<<"decymalny -> hexa press h"<<endl;
       cin>>ch;
       if(ch=='b' && liczba<2)cout<<"liczba w kodzie bin. =000"<<liczba;
       if(ch=='b' && liczba>1)bin(liczba);
       if(ch=='o' && liczba<8)cout<<"liczba w kodzie oct. =000"<<liczba;
       if(ch=='o' && liczba>7)oct(liczba);
       if(ch=='h' && liczba<10)cout<<"liczba w kodzie hex. =000"<<liczba;
       if(ch=='h' && liczba>9 && liczba<16)
       { int j=liczba-9;
         cout<<"liczba w kodzie hex. =0"<<tab[j-1];}
       if(ch=='h' && liczba>15)hex(liczba);
       getch();
    }
       void bin(int liczba)
       {
         i=0;  
         while (liczba>1)
         { 
            reszta=liczba % 2;    
            if(reszta>0)wynik[i]=reszta;
            liczba=liczba / 2;
            i=i+1;
            if(liczba<2)
            {wynik[i]=liczba;break;}
         }   
         cout<<"liczba w kodzie binarnym= "<<endl;
         for(int j=i;j>=0;j--)
          cout<<wynik[j]<<" ";
       }
    
       void oct(int liczba)
       {
          i=0;
          while(liczba>7)
          {
           reszta=liczba % 8;
           if(reszta>0)wynik[i]=reszta;
           liczba=liczba / 8;
           i=i+1;
           if(liczba <8)
           {wynik[i]=liczba;break;}               
            }   
                cout<<"liczba w kodzie octalnym= "<<endl; 
                   for(int j=i;j>=0;j--)
          cout<<wynik[j]<<" "; 
       }
       
         void hex(int liczba)
         {
             i=0; 
           while(liczba>15)
           {
            reszta=liczba % 16;
            if(reszta>0)wynik[i]=reszta;
            liczba=liczba / 16;
            i=i+1;
            if(liczba<16)
             {
              wynik[i]=liczba;break; }  
           }     
            cout<<"liczba w kodzie hexadecymalnym= "<<endl;      
               for(int j=i;j>=0;j--)
               {
                 if(wynik[j]<10) cout<<wynik[j];else
                  {
                    int k=wynik[j]-9;
                    cout<<tab[k-1];
                  }                   
            }                         
          }
    

    Bardzo ładnie, ale mam jedną uwagę. Zmiennych globalnych raczej się nie używa, to BARDZO zły nawyk programistyczny. Niemądre używanie może spowodować rozspójnienie danych.
  • REKLAMA
  • #5 9534759
    lolcio
    Poziom 16  
    Posty: 133
    Pomógł: 29
    Ocena: 8
    Bardzo ładnie, ale mam jedną uwagę. Zmiennych globalnych raczej się nie używa, to BARDZO zły nawyk programistyczny. Niemądre używanie może spowodować rozspójnienie danych.

    Rozspójnienie danych? Wybacz ale pierdoły wypisujesz :) Zmienne globalne są bezpieczne w użyciu, ale są niedopuszczalne w profesjonalnych programach z innego powodu.

    Wyobraź sobie że piszesz jakiejś firmie biblioteke w której są funkcje obliczające różne rzeczy i nie działają one bez kilku zmienych globalnych. Tak że kiedy firma chce użyć kupionej od Ciebie biblioteki za każdym razem musi zadeklarować te zmienne w swoich programach. Jest to bardzo rażące w oczy :)

    Zmienne globalne to najczęściej wynik złego zaprojektowania aplikacji, ale nie powodują błędów.
    Mają jedną fajną ceche nawet...są zawsze inicjowane automatycznie zerem( Jeżeli podzielisz przez to zero to może Ci się wykrzaczyć program owszem :P ). Czasami nawet nie da się ich obejść (bądz nie zauważono sposobu :P ), świadczy o tym środowisko programistyczne borlanda w którym kiedyś przez długi czas siedziała zmienne globalna...i żadnego rozspójnienia danych nie powodowała :P Pozrawiam
  • #6 9534775
    Xitami
    Poziom 29  
    Posty: 1130
    Pomógł: 118
    Ocena: 31
    #define jeden ('/'/'/')
    #define zero  ('-'-'-')
     
    typedef unsigned int uint;
     
    uint inc(uint _a){
        uint _b = jeden;
        while(_a & _b){
            _a ^= _b;
            _b <<= jeden;}
        return _a | _b;}
     
    uint plus(uint _a, uint _b){
        uint dec = zero, _c = zero, _i=zero;
        while(_a | _b){
            uint _a0 = _a & jeden;
            uint _b0 = _b & jeden;
            uint _s = _a0 ^ _b0 ^ _c;
            _c = ((_a0 ^ _b0) & _c) | (_a0 & _b0);
            _a >>= jeden; _b >>= jeden;
            dec |= _s << _i;
            _i = inc(_i);}
        return dec | _c << _i;}
    funkcja plus zwraca _a+_b

    Dodano po 35 [minuty]:

    a dec->bin można zrobić tak:
    main(a,b){
    	if (b) {scanf("%d", &a);
    		main(a,0);
    	} else {if(a-1)main(a/2,0);
    		putchar((a&1)+ 48);}} 

    https://ideone.com/J0qlT
  • REKLAMA
  • #8 10224017
    radzio515
    Poziom 10  
    Posty: 10
    lolcio napisał:
    Bardzo ładnie, ale mam jedną uwagę. Zmiennych globalnych raczej się nie używa, to BARDZO zły nawyk programistyczny. Niemądre używanie może spowodować rozspójnienie danych.

    Rozspójnienie danych? Wybacz ale pierdoły wypisujesz :) Zmienne globalne są bezpieczne w użyciu, ale są niedopuszczalne w profesjonalnych programach z innego powodu.

    Wyobraź sobie że piszesz jakiejś firmie biblioteke w której są funkcje obliczające różne rzeczy i nie działają one bez kilku zmienych globalnych. Tak że kiedy firma chce użyć kupionej od Ciebie biblioteki za każdym razem musi zadeklarować te zmienne w swoich programach. Jest to bardzo rażące w oczy :)

    Zmienne globalne to najczęściej wynik złego zaprojektowania aplikacji, ale nie powodują błędów.
    Mają jedną fajną ceche nawet...są zawsze inicjowane automatycznie zerem( Jeżeli podzielisz przez to zero to może Ci się wykrzaczyć program owszem :P ). Czasami nawet nie da się ich obejść (bądz nie zauważono sposobu :P ), świadczy o tym środowisko programistyczne borlanda w którym kiedyś przez długi czas siedziała zmienne globalna...i żadnego rozspójnienia danych nie powodowała :P Pozrawiam


    Nie zrozumieliśmy się. Mechanizm zmiennych globalnych głównie używany jest przy wielowątkowości. Gdy nie zaryglujemy muteksu(co jest rownoznaczne z brakiem synchronizacji), wątki pracujące na zmiennej globalnej pracują asynchronicznie. Dlatego też jeżeli nie używamy z programów wielowątkowych nie wykorzystujemy zmiennych globalnych(bo mozemy nie widziec ze cos nam ta zmienna globalna zmienia)

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczyła implementacji algorytmu w języku C do konwersji liczb dziesiętnych na system binarny oraz metod dodawania liczb binarnych. Zaproponowano przykładowy program w C umożliwiający konwersję liczby dziesiętnej na binarną, ósemkową lub szesnastkową, z wykorzystaniem funkcji rekurencyjnych i tablic do przechowywania wyników. Poruszono kwestie stosowania zmiennych globalnych, które choć nie powodują błędów, są uważane za zły nawyk programistyczny ze względu na utrudnienia w utrzymaniu i potencjalne problemy w programach wielowątkowych. Przedstawiono także alternatywne podejście do dodawania liczb binarnych za pomocą operacji bitowych (XOR, AND, przesunięcia bitowe) oraz funkcji inkrementacji. Wskazano na problem synchronizacji wątków przy użyciu zmiennych globalnych oraz podano link do podobnego wątku na forum. Ogólnie dyskusja skupiała się na efektywnych i prostych metodach konwersji i operacji na liczbach binarnych w C, z uwzględnieniem dobrych praktyk programistycznych.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA