• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zamian liczby binarnej na dziesiętną

VPS Starter Arubacloud
0 głosów
750 wizyt
pytanie zadane 19 września 2019 w C i C++ przez magda_19 Gaduła (3,080 p.)

Witam,  mam funkcję, która zmienia liczby dziesiętne na binarne, ale nie umiem napisać kodu tak aby zamieniał binarne na dziesiętne

int konwersjaLiczb(int liczbaDziesietna)
{
       string liczbaBinarna;
       int nowaLiczbaDziesietna = 0;
       const int potega = 2;

        // zamiana dziesietnej na binarna 
        for (; liczbaDziesietna; liczbaDziesietna /= 2)
        {
            liczbaBinarna+= (liczbaDziesietna % 2) + 48;
        }

       
    for (int i = 0; i < liczbaBinarna.size(); i++)
    {
        nowaLiczbaDziesietna = (liczbaBinarna[i] - 48) * potega;
        cout << nowaLiczbaDziesietna;
    }

        cout << "\n";

        return nowaLiczbaDziesietna;
}

 

2
komentarz 19 września 2019 przez tkz Nałogowiec (42,020 p.)

1 odpowiedź

0 głosów
odpowiedź 19 września 2019 przez profesorek96 Szeryf (91,420 p.)

Proszę bardzo:

#include <iostream>
using namespace std;

int bin_dec(string bin)
{
	int d=bin.length();
	int podstawa=1;
	int dec=0;
	for(int i=d-1;i>=0;i--)
	{
		dec+=(bin[i]-'0')*podstawa;
		podstawa*=2;
	}
	return dec;
}


int main() {
	
	cout<<bin_dec("1011");
	return 0;
}

 

komentarz 19 września 2019 przez tkz Nałogowiec (42,020 p.)
#include <iostream>
#include <type_traits>
#include <string>

template<typename T>
auto bin_dec(T bin)
{
    if constexpr(std::is_same_v<T, std::string>)
    {
        int d=bin.length();
        int podstawa=1;
        int dec=0;
        for(int i=d-1;i>=0;i--)
        {
            dec+=(bin[i]-'0')*podstawa;
            podstawa*=2;
        }
        return dec;
    }
    else
    {
        long factor = 1;
        long total = 0;
        while (bin != 0)
        {
            total += (bin % 10) * factor;
            bin /= 10;
            factor *= 2;
        }
        return total;
    }
}

int main(void)
{
    using namespace std::string_literals;
    std::string bin("101");
    int binInt = 101;
    std::cout<<bin_dec("101"s)<<"\n";
    std::cout<<bin_dec(binInt);
    return 0;
}

Wydaje mi się bardziej uniwersalny...

1
komentarz 19 września 2019 przez j23 Mędrzec (195,220 p.)

@profesorek96,   ździebko przekombinowane. Można prościej:

int bin_dec(std::string_view bin)
{
    int acc = 0;
    
    for (char c : bin) {
        acc <<= 1;
        acc |= c - '0';
    }

    return acc;
}

 

komentarz 19 września 2019 przez j23 Mędrzec (195,220 p.)

@tkz, mogłeś dać ograniczenie, by nie-string był typem całkowitoliczbowym.
 

komentarz 19 września 2019 przez profesorek96 Szeryf (91,420 p.)

@j23,
Nice :) Koszerny ci wyszedł ten kod. Prawdziwy znawca C++.

komentarz 19 września 2019 przez tkz Nałogowiec (42,020 p.)
Nie tylko całkowitoliczbowy, ale mogłem pomyśleć o Twoim sposobie... Dzięki.
komentarz 20 września 2019 przez magda_19 Gaduła (3,080 p.)

@profesorek96, Dzięki, mało mi brakowało. Zabrakło tylko + i inicjalizacji podstawy. A tak przy okazji, mógłbyś rzucić okiem co ty jest nie tak? Liczba wciąż rośnie dla wpisanych danych, a ja już nie mam pomysłu dlaczego.

 

#include <iostream>
#include <math.h>

using namespace std;


int main()
{
    int liczbaDziesietna = 0;
    int nowaLiczbaDziesietna = 0;
    int podstawa = 1;
    string liczbaBinarna;

    while(cin >> liczbaDziesietna)
    {
        liczbaBinarna = "0";
        nowaLiczbaDziesietna = 0;

        for(; liczbaDziesietna; liczbaDziesietna /= 2)
        {
            liczbaBinarna += liczbaDziesietna % 2 + '0';
        }

        for (int i = liczbaBinarna.size() - 1; i >= 0; i--)
        {
            nowaLiczbaDziesietna += (liczbaBinarna[i]-'0') * podstawa;
            podstawa *= 2;
        }

        cout << nowaLiczbaDziesietna << endl;;

    }
    return 0;
}

 

 

komentarz 20 września 2019 przez j23 Mędrzec (195,220 p.)
edycja 20 września 2019 przez j23

Powinnaś ustawiać zmienną podstawa na 1 co każdą iterację. Dodatkowo źle konwertujesz dec -> bin. Tak można zrobić:

    unsigned mask = 0x800000;

    while (mask && !(liczbaDziesietna & mask)) { mask >>= 1; }

    while (mask) {
        liczbaBinarna += liczbaDziesietna & mask ? '1' : '0';
        mask >>= 1;
    }

Jakby komuś przeszkadzała instrukcja warunkowa, to linię szóstą można zamienić na:

        liczbaBinarna += "10"[((static_cast<unsigned>(liczbaDziesietna) & mask) - mask) >> 31];

 

Podobne pytania

0 głosów
1 odpowiedź 2,924 wizyt
0 głosów
0 odpowiedzi 370 wizyt
0 głosów
2 odpowiedzi 501 wizyt
pytanie zadane 15 maja 2020 w JavaScript przez Kubunio Początkujący (270 p.)

92,834 zapytań

141,778 odpowiedzi

320,827 komentarzy

62,164 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...