Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zamiana z dziesiętnego na binarny

Ostatnio zmodyfikowano 2017-12-16 02:25
Autor Wiadomość
Zigor36
Temat założony przez niniejszego użytkownika
Zamiana z dziesiętnego na binarny
» 2017-12-15 16:09:20
Witam, szukam lekkiej pomocy z moim programem zamieniającym liczbę dziesiętną na binarną. Kompilator nic nie wykrywa, ale już w programie gdy poda się daną liczbę, zamiast liczyć ją na bin, to pokazuje same jedynki albo zera.
C/C++
#include <iostream>
#include <conio.h>
using namespace std;
int liczba, ile = 1;
int main()
{
    cout << "Podaj liczbe: ";
    cin >> liczba;
    int tab[ ile ];
    for( int x = 0; x <= ile; x++ )
    {
        if( liczba % 2 == 0 )
        {
            tab[ x ] = 0;
            cout << tab[ x ];
            ile++;
        }
        else
        {
            tab[ x ] = 1;
            cout << tab[ x ];
            ile++;
        }
    }
    getch();
}
P-167926
Zigor36
Temat założony przez niniejszego użytkownika
» 2017-12-15 16:15:48
Ok kombinowałem trochę i działa dobrze, ale pokazuje na ekran tylko 5 cyfr. I teraz znów myślę w jaki sposób mógłbym zapisać warunek ile razy ma się wykonać pętla for. Zamiast 5 napisałem "ile", tylko jak mogę dowiedzieć się ile razy ta pętla ma się wykonać, jakiego algorytmu do tego użyć? Totalnie nie mam pomysłu, ale wciąż myślę, proszę was nakierujcie mnie jakoś :D
C/C++
#include <iostream>
#include <conio.h>
using namespace std;
int liczba, ile;
int main()
{
    cout << "Podaj liczbe: ";
    cin >> liczba;
    for( int x = 0; x <= ile; x++ )
    {
        int tab[ ile ];
        if( liczba % 2 == 0 )
        {
            liczba = liczba / 2;
            tab[ x ] = 0;
            cout << tab[ x ];
        }
        else if( liczba % 2 == 1 )
        {
            liczba = liczba / 2;
            tab[ x ] = 1;
            cout << tab[ x ];
        }
        else
             exit( 0 );
       
    }
    getch();
}
P-167927
mateczek
» 2017-12-16 02:25:56
kilka sposobów na zamianę:

1. Metoda z funkcją rekurencyjną jak dla mnie jest najtrudniejsza do wyobrażenia. Ale ma odwracanie bitów niejako z automatu.
2. W metodzie drugiej policzyłem długość liczby w zapisie binarnym korzystając z właściwości że jest ona równa "log2(liczba)+1" Dlatego mogę wpisywać do stringa od końca;
3. W metodzie pierwszej nowo wyliczone pole wstawiam na początek stringa przy pomocy funkcji insert (gdybym dodawał na koniec musiał bym po konwersji odwrócić bity)

C/C++
#include <iostream>
#include<cmath>
#include<string>
using namespace std;


//metoda3 funkcja rekurencyjna
string intToStr( int numer )
{
    char znak = numer % 2 + '0';
    numer /= 2;
   
    if( numer > 0 ) {
        return intToStr( numer ) + znak;
    } else {
        string temp( 1, znak );
        return temp;
    }
}

int main()
{
    int liczba;
    cout << "Podaj liczbe: ";
    cin >> liczba;
   
    int temp = liczba; //kopiowanie liczby do tempa by nie zniszczyć liczby
    string tab, tab2; //tablice na skonwertowanie liczby
   
    //metoda 1;
    while( temp ) { //póki liczba nie jest zerem wykonuj
        tab.insert( tab.begin(), temp % 2 + '0' );
        temp /= 2; //liczba=liczba/2
    }
   
    //metoda 2
    temp = liczba;
    int binlong = log2( temp ); //długość liczby w systemie dwójkowym można policzyć tak
    tab2.resize( binlong + 1 ); //ustawiam rozmiar tablicy na długość oczekiwanego stringa
    for( int i = binlong; i >= 0; i-- ) { //wpisuje od pola ostatniego i jadę do początku
        tab2[ i ] = temp % 2 + '0';
        temp /= 2;
    }
    cout << tab << "     " << tab2 << "         " << intToStr( liczba ) << endl;
   
}

w każdym zapisie zamiast "/2" mogę zastosować operator przesuwania bitów o jeden ">>=1". A zamiast dzielenia modulo testowanie przy pomocy maski "&1"

C/C++
#include <iostream>
#include<string>
using namespace std;
int main() {
    cout << "Podaj liczbe: ";
    int liczba;
    cin >> liczba;
    string tab;
    while( liczba ) {
        tab.insert( tab.begin(),( liczba & 1 ) + '0' ); //testowanie bitu na jedykę
        liczba >>= 1; //przesówanie o jeden
    }
    cout << tab << endl;
}
P-167930
« 1 »
  Strona 1 z 1