Dezimalzahl zu Binärzahlen umwandeln

tobit

Grünschnabel
Hallo liebe Tutorials.
Ich soll einen Programm schreiben, der Dezimalzahlen in Bitzahlen umrechnet.
Die verändernde Bitnummer 0 oder 1, wird eingelesen.
Das habe ich soweit auch geschafft.
Nun muss das Programm (nach Änderung des Bits) die neue Bitzahl und Dezimal Zahl ausgeben.
Ich mache einen Beispiel, damit ihr besser versteht, was ich meine
Zahl 4; Bitzahl 0100
ich änder die dritte Bit von 1 auf 0=0000
Nun habe ich mir überlegt ob ich es so machen konnte 0100&000 =0000
Nun wird es bei der Bits, die von 0 auf 1 gesetzt nicht funktionieren , da 1&0 ergibt 0
Ich habe lange daran gesessen und weiß nicht wie ich voran komme.
Code:
#include <iostream>
#include <math.h>
#include<limits>
#include<bitset>
using namespace std;

int main()
{
    int einsen=0;
    cout << "Geben Sie eine Zahl ein: ";
    unsigned int zahl = 0;
    cin >> zahl;
    int anzahlDerBytes = sizeof zahl;
    int anzahlDerBits = 8 * anzahlDerBytes;


    cout <<zahl<<":";
    for(int i = anzahlDerBits-1; i >= 0 ; --i)
    {
        if(zahl & (1 << i))
        {
            ++einsen;
            cout << "1";
        }
        else
        {
            cout << "0";
        }

    }
    cout<<'\n'<<"Das Bitmuster hat "<<einsen<<" Einsen.";
    cout << endl;

    unsigned int Bitnummer= 0;

    cout<<"Welches Bit (0-31 von rechts beginnend) soll geaendert werden?  ";
    cin>>Bitnummer;
    cout<<endl;
    cout<<"Auf welchen Wert (0 oder 1) soll das Bit gesetzt werden? ";
    if (Bitnummer>=0 && Bitnummer<32)
    {
        if (zahl&(1<<Bitnummer))
        {

            cout<<"0";
        }
        else
        {
            cout<<"1";
        }
        cout<<endl;
    }
    for(int i = anzahlDerBits-1; i >= 0 ; --i)
    {
        if((zahl & (1 << i))&(zahl&(1<<Bitnummer)))
        {

            cout<<"0";
        }
        else
        {
            cout<<"1";
        }
    }
    cout<<endl;
    return 0;
}

Ich werde mich freuen, wenn jemand sich es anschaut und mir dabei helfen würde
 

Technipion

Erfahrenes Mitglied
Hallo tobit,
ich glaube eigentlich, dass cwriter dir das schonmal erklärt hat. Aber trotzdem kommt hier nochmal eine konkrete Zusammenfassung:

Wenn du einzelne Bits setzen möchtest, hängt die Vorgehensweise davon ab, ob du eine 1 oder eine 0 erzeugen möchtest. In beiden Fällen erzeugst du zunächst eine (Bit-)Maske, und kombinierst diese dann auf eine bestimmte Art und Weise mit deiner Zahl. Nehmen wir dein Beispiel:

n = 4 = 0b0100
mask = 0b1011
result = n & mask = 0b0100 & 0b1011 = 0b0000

Warum? Weil bei der AND-Operation beide Seiten 1 sein müssen, damit die 1 stehen bleibt. Dort wo deine Maske eine 0 enthält wird nach der AND-Verknüpfung immer eine 0 stehen. (Übrigens sollten alle Stellen die nicht beeinflusst werden sollen in der Maske eine 1 enthalten, damit die originale Zahl dort nicht verändert wird).

Lass uns mal Bit 2 auf 1 setzen:

n = 4 = 0b0100
mask = 0b0010
result = n | mask = 0b0100 | 0b0010 = 0b0110

Warum? Weil bei der OR-Operation nur ein einziges Bit ausreicht um eine 1 zu erzeugen. Dort wo deine Maske eine 1 enthält wird also später definitiv eine 1 stehen. (Stellen die nicht beeinflusst werden sollen, sollten in der Maske eine 0 enthalten).

Soweit zur Theorie. Hast du das alles verstanden?

Gruß Technipion
 

cwriter

Erfahrenes Mitglied
@Technipion hat natürlich wie immer recht.

Wenn du allerdings wirklich nur ein Bit ändern (=invertieren) willst, dann bist du mit XOR (^) besser dran.
C:
0b1001 ^ (1 << 3) == 0b0001
0b1001 ^ (1 << 2) == 0b1101
0b1001 ^ (1 << 1) == 0b1011
0b1001 ^ (1 << 0) == 0b1000

Gruss
cwriter