binäres int nach dezimal konvertieren



  • Hallo Leute,

    ich habe zu diesem Thema schon viel gefunden, aber irgendwie passt nix zu meinem Problem.

    Erstmal mein Ziel:
    Ich bekomme ein unsigned int mit 0en und 1en, also eine binäre Zahl.
    Diese muss ich in dezimal umrechnen, um damit weiterrechnen zu können.

    ich habe algorithmen gefunden, um binär zu dezimal zu wandeln.
    dies wird immer mit strings gemacht, die von der konsole eingelesen werden.
    wenn ich die vorgeben will, muss ich erst das int zu string machen,
    aber auch das scheiterte, weil er natürlich das binäre nicht erkennt und z.b. to_string was ganz anderes liefert.

    ich stehe irgendwie auf dem Schlauch und weiß mittlerweile vom ganzen suchen gar nix mehr.

    Könnt ihr mir helfen ?

    😉 😉 EmbSofti 😉 😉



  • Du hast also ein Array von unsigned int wo entweder 0 oder 1 steht und willst das zu einer Dezimalzahl konvertieren? Das könnte irgendwie so aussehen:

    #include <iostream>
    
    int main()
    {
    	int binary[] = {1, 1, 1, 0, 1};
    	int num = 0;
    	for(int i = 0; i < sizeof(binary)/sizeof(*binary); ++i)
    		num = 2*num + binary[i];
    
    	std::cout << num << std::endl;
    }
    

    Wenn du was anderes meinst musst du nochmal genauer erklären was du hast und was du möchtest.



  • Wenn ich EmbSofti richtig verstanden hat, sucht der den Algo für die Funktion foo(unsigned int). Glaube ich ... zumindest hatte er nichts von int-array geschrieben.

    int a = 1000101;
    int b = foo(a);   // b wäre danach 69?!?
    


  • Hallo AllesNurGeraten,

    ja genau.

    ich bekomme eine integerzahl, die aber nur nullen und einsen enthält.
    diese brauche ich wieder als int, aber als dezimalzahl konvertiert.

    Ideen ?



  • unsigned int foo(unsigned int bin)
    {
    	unsigned int num = 0;
    	for(int i = 0; bin != 0; ++i)
    	{
    		num += bin%10 << i;
    		bin /= 10;
    	}
    	return num;
    }
    


  • Er will binär nach dezimal:

    int bin2dec(const std::string &bin) 
    { 
        int num = 0; 
    	int rdx = 1;
        //durch den string rückwärts iterieren 
        for(std::string::const_reverse_iterator i=bin.rbegin();i!=bin.rend();++i) 
        { 
            int digit = *i-'0'; //zeichen in eine zahl konvertieren 
            num += digit*rdx; 
    		rdx *= 2;
        }
        return num; 
    }
    


  • Hallo,

    @sebi707:

    den algo kenn ich schon und der funktioniert auch prima, ABER sobald die zahl mit 0 beginnt, funktioniert es nicht mehr.

    @roflo:

    hier übergebe ich wieder einen string.
    ich habe immernoch das problem, dass ich eine int zahl, die mit 0 beginnt,
    nicht vernünftig zu string bekomme.



  • Da hast du wohl einen Denkfehler. Einerseits gibt es den abstrakt Wert, andererseits die Darstellung, z.b. durch einen Stellenwertsystem wie das Binär- und Dezimalsystem oder was auch immer (Strichliste, römische Ziffern, etc.).
    Datentypen wie int, long, float etc. speichern den Wert; wie das intern aussieht ist eine andere Frage.



  • Das musst du mir grad nochmal näher erklären

    das versteh ich grad ned, worauf du hinaus willst

    der erste algo funzt ned, wenn ne 0 vorne ist
    und deiner will ein string, das bekomm ich ned hin



  • Zahlen die mit 0 beginnen machen eigentlich keinen Sinn daher markiert man dadurch eine Zahl zur Basis 8 (http://en.cppreference.com/w/cpp/language/integer_literal). Das Problem ist daher nicht im Algorithmus sondern wie du deine Zahlen eingibst. Welchen Sinn hat die ganze Sache eigentlich? Woher kommen deine Zahlen? Wenn du einfach nur binäre Zahlen im Quellcode eingeben möchtest gibt es dafür auch eine Schreibweise (Erst seit C++14 können aber viele Compiler schon länger):

    unsigned int a = 0b1000101;
    cout << a << endl; // Gibt 69 aus
    

    Du musst bedenken, dass Variablen wie int im Speicher immer binär abgelegt sind und nur zur Anzeige in dezimale/hexazimale oder was auch immer Schreibweise konvertiert werden.



  • hi sebi707,

    ja das ist mir schon klar. 😃 😃

    ich bekomme über einen CAN Bus binäre Daten als unsigned int.
    Daher muss ich irgendwas finden, um es umzurechnen.

    dieses Unsigned int kann natürlich so aussehen: 001110



  • EmbSofti schrieb:

    ich bekomme über einen CAN Bus binäre Daten als unsigned int.
    Daher muss ich irgendwas finden, um es umzurechnen.

    Warum muss man da was umrechnen? Schreib die binären Daten einfach wieder in ein unsigned int und fertig? Oder wie verstehst du binäre Daten. Binäre Daten sind bei mir nicht ein unsigned int das in der Dezimaldarstellung nur Einsen und Nullen hat.



  • wenn ich einen int wert in einen int wert schreibe, kommt genau das gleiche raus, was in dem ersten int drinstand und wenn sogar ne null vorne ist, irgendeine zahl

    es geht darum, dass ich was berechnen muss und dafür benötige ich den dezimalen wert.

    ich bekomme aber nur vom CAN einen unsigned int wert, dessen inhalt aber eigentlich binär ist.

    der int wert ist z.b. int i = 0110;
    ich muss den aber interpretieren als i = 0b0110

    bsp:

    ich bekomme eine geschwindigkeit in km/h vom CAN
    Die CAN Daten sind ein 12 Bit unsigned int - z.b. 011011100101

    um die richtige reale geschwindigkeit auszurechnen, hab ich eine formel:

    Geschwindigkeit = 0.1 * (DEZ) [km/h]

    das habe ich mit allen werten, die ich bekomme - immer mit entsprechenden umrechnungsformel.

    aber um das rechnen zu können, brauche ich dieses int als dezimalzahl...



  • Wie gesagt ein int enthält einen Wert, keine Darstellung eines Wertes. Wenn es dir die Zahl 1000101 liefert, dann ist das ein Wert, welcher im Binärsystem dargestelllt ist. Du hast also einen abstrakten, unvorstellbaren Wert, welcher nur durch eine Darstellung wie z.B. im Binärsystem oder Dezimalsystem oder römische Ziffern oder Striche oder Schafe oder... dargestellt werden kann.



  • Wie verschickst du die Daten denn über CAN? Du verschickst doch sicher Bytes oder irgendwas? Dann brauchst du eigentlich überhaupt nichts umrechnen. Auf der Sender Seite steht irgendwas wie:

    unsigned int x;
    canSendBytes((char*)&x, sizeof(x));
    

    Und auf der Empfänger Seite:

    unsigned int x;
    canRecvBytes((char*)&x, sizeof(x));
    

    Siehe dazu auch aktuell diesen Thread.



  • @EmbSofti
    int ist intern immer binär.
    Es kann höchstens noch sein dass das genaue Format nicht passt (z.B. Endianness, ones-complement vs. twos-complement).

    Ich vermute dir fehlt da noch ein bisschen das grundlegende Verständnis für Bits und Bytes und wie das ganze mit C, C++ etc. zusammenspielt.



  • Oha ... da hab ich ja richtig geraten.

    Dann vergiss aber nicht den Entwickler zu schlagen, der DAS verbrochen hat!!
    Eine binäre Zahl in einem Integerwert darstellen ... das würde ich mich ja noch nichtmal trauen am 1. April einzubauen! 🤡



  • EmbSofti schrieb:

    wenn ich einen int wert in einen int wert schreibe, kommt genau das gleiche raus, was in dem ersten int drinstand und wenn sogar ne null vorne ist, irgendeine zahl

    Integer Literale mit 0 vorn dran sind in C und C++ Oktalzahlen.
    Also 07 ist 7, 08 und 09 gibt's nicht und 010 ist 8.

    ----

    Falls du wirklich eine Binärzahl bekommst deren Dezimaldarstellung als Binärdarstellung reinterpretiert werden muss...

    #include <iostream>
    
    unsigned int FuckedUpToNormal(unsigned int fuckedUpNumber)
    {
    	unsigned int normalNumber = 0;
    	unsigned int bitValue = 1;
    	while (fuckedUpNumber != 0)
    	{
    		if ((fuckedUpNumber % 10) != 0)
    			normalNumber += bitValue;
    		fuckedUpNumber /= 10;
    		bitValue *= 2;
    	}
    	return normalNumber;
    }
    
    int main()
    {
    	unsigned int fuckedUpNumber = 1101; // "13"
    	std::cout << FuckedUpToNormal(fuckedUpNumber);
    	return 0;
    }
    


  • Mal am Rande:

    Kann es vielleicht sein, dass wir hier über BCD reden?



  • Hallo,

    nein es ist kein BCD

    Es ist genau das, was hustbaer meinte.

    und der algo funzt für meine bedürfnisse

    vielen dank 👍 👍 👍 👍


Log in to reply