Bit in Bitzahl ändern

tobit

Grünschnabel
Hallo
Das Programm soll Dezimalzahlen in Bitzahlen umrechnen und das tut er auch

Code:
#include<iostream>
#include<cmath>
#include <limits.h>

using namespace std;

int main()
{
    int einsen=0;
    unsigned int Eingabe=0;

    const int bits_int = sizeof(int)*CHAR_BIT ;
    int feld[bits_int];
    cout<<"Geben Sie eine Zahl ein: ";
    cin>>Eingabe;
    cout<<Eingabe<<":";
    for (int i=bits_int-1; i >= 0; i--)
    {
        feld[i]=Eingabe%2;
        Eingabe/=2;
    }
    for(int i=0; i<bits_int;i++)
    {
        cout<<feld[i];
        if (feld[i]== 1){

        ++einsen;}}
        cout<<'\n'<<"Das Bitmuster hat "<< einsen<<" Einsen.";
       
        cout<<'\n'<<"Welches Bit(0-31 von rechts beginnend)soll geandert werden?";

    return 0;}
jetzt möchte ich auf die Bits zugreifen
z.b 0001000 => 0001001
und die neue Bitzahl ausgeben

Übigens ich bin noch einen Anfänger
Danke
 
Zuletzt bearbeitet:

cwriter

Erfahrenes Mitglied
jetzt möchte ich auf die Bits zugreifen
z.b 0001000 => 0001001
und die neue Bitzahl ausgeben
Cool, viel Glück dabei!
Wolltest du uns das nur mitteilen oder auch eine Frage dazu stellen? Und bitte kein "wie mache ich das". Zumindest eine grobe Vorangehensweise, die du umsetzen möchtest, solltest du schon angeben können.

Übigens ich bin noch einen Anfänger
Guter Tipp für Anfänger: Formatiere deinen Code besser. Es gibt 2 grössere Stile und mehrere Unterkategorien.
https://de.wikipedia.org/wiki/Einrückungsstil

Persönlich finde ich den Allman-Style am besten für C-Derivate.
C++:
if(x)
{
    for(;;)
    {
        //...
    }
}
Manche bevorzugen den Java-Style, hauptsächlich, weil es Zeilen spart.
C++:
if(x) {
    for(;;) {
        //...
    }
}

Was kein Stil ist, ist dein Mix aus Einrückungen und doppelten '}'.
C++:
    for(int i=0; i<bits_int;i++)
    {
        cout<<feld[i];
        if (feld[i]== 1){

        ++einsen;}} // Woran binden diese '}'?
Für den Compiler ist es egal, denn Whitespaces kommen nur an wenigen Stellen der Syntax vor (hauptsächlich Definitionen), aber ein Mensch hat Mühe, diesen Code zu lesen.

Gruss
cwriter
 

tobit

Grünschnabel
Cool, viel Glück dabei!
Wolltest du uns das nur mitteilen oder auch eine Frage dazu stellen? Und bitte kein "wie mache ich das". Zumindest eine grobe Vorangehensweise, die du umsetzen möchtest, solltest du schon angeben können.


Guter Tipp für Anfänger: Formatiere deinen Code besser. Es gibt 2 grössere Stile und mehrere Unterkategorien.
https://de.wikipedia.org/wiki/Einrückungsstil

Persönlich finde ich den Allman-Style am besten für C-Derivate.
C++:
if(x)
{
    for(;;)
    {
        //...
    }
}
Manche bevorzugen den Java-Style, hauptsächlich, weil es Zeilen spart.
C++:
if(x) {
    for(;;) {
        //...
    }
}

Was kein Stil ist, ist dein Mix aus Einrückungen und doppelten '}'.
C++:
    for(int i=0; i<bits_int;i++)
    {
        cout<<feld[i];
        if (feld[i]== 1){

        ++einsen;}} // Woran binden diese '}'?
Für den Compiler ist es egal, denn Whitespaces kommen nur an wenigen Stellen der Syntax vor (hauptsächlich Definitionen), aber ein Mensch hat Mühe, diesen Code zu lesen.

Gruss
cwriter
// Woran binden diese '}'? Es bindet sich an for und if
ja das war eine Frage
Ich habe gegooglt und fand was wie Bit setzten aber da gab es keinen richtigen Bespiel, den ich anwenden könnte
Hast du da vielleicht einen Beispiel
 

ComFreek

Mod | @comfreek
Moderator
// Woran binden diese '}'? Es bindet sich an for und if
Ja, so kann man das sehen. Nach If und For muss immer ein Block kommen. Ein solcher Block kann entweder eine einzelne Zeile sein oder eben ein explizit ausgewiesener Block mit mehreren Zeilen, welcher mit { begonnen und mit } beendet wird.
(Mit Zeile meine ich eigentlich Statement ;) Also "x = 2;" ist ein Statement, "x = 2; y = 3;" sind zwei Statements.)

Ich finde sehr viele Ergebnisse und Beispiele mit den Suchbegriffen "c set bit in integer". In der Tat sind die Ergebnisse zu "c++" oder "cpp" statt "c" ein bisschen dürftiger.
 

cwriter

Erfahrenes Mitglied
// Woran binden diese '}'? Es bindet sich an for und if
Ok, ich bin froh, dass dieses Verständnis da ist. Ich wollte eigentlich darauf hinaus, dass man
C++:
    for(int i=0; i<bits_int;i++)
    {
        cout<<feld[i];
        if (feld[i]== 1){

        ++einsen;}} // Woran binden diese '}'?
Auch so schreiben kann:
C++:
    for(int i=0; i<bits_int;i++)
    {
        cout<<feld[i];
        if (feld[i]== 1)
        {
            ++einsen;
        }
    }
So kann man nämlich den vertikalen Linien folgen, um Blöcke zu erkennen. (Die zugehörigen '{' '}'-Paare sind in derselben Spalte). Siehe auch Gestalt-Gesetze.
ja das war eine Frage
Sehe ich anders, aber gut.

Ich habe gegooglt und fand was wie Bit setzten aber da gab es keinen richtigen Bespiel, den ich anwenden könnte
Hast du da vielleicht einen Beispiel
Wie man Bits setzt? Ist das die Frage?
C++:
int val = 0;
val |= (1 << n); // Setzt das n-te Bit auf 1 (OR)
val &= ~(1 << n); // Setzt das n-te Bit auf 0 (AND NOT)
val ^= (1 << n); // invertiert das n-te Bit (XOR)

Gruss
cwriter
 

tobit

Grünschnabel
Ok, ich bin froh, dass dieses Verständnis da ist. Ich wollte eigentlich darauf hinaus, dass man
C++:
    for(int i=0; i<bits_int;i++)
    {
        cout<<feld[i];
        if (feld[i]== 1){

        ++einsen;}} // Woran binden diese '}'?
Auch so schreiben kann:
C++:
    for(int i=0; i<bits_int;i++)
    {
        cout<<feld[i];
        if (feld[i]== 1)
        {
            ++einsen;
        }
    }
So kann man nämlich den vertikalen Linien folgen, um Blöcke zu erkennen. (Die zugehörigen '{' '}'-Paare sind in derselben Spalte). Siehe auch Gestalt-Gesetze.

Sehe ich anders, aber gut.


Wie man Bits setzt? Ist das die Frage?
C++:
int val = 0;
val |= (1 << n); // Setzt das n-te Bit auf 1 (OR)
val &= ~(1 << n); // Setzt das n-te Bit auf 0 (AND NOT)
val ^= (1 << n); // invertiert das n-te Bit (XOR)

Gruss
cwriter
Danke für den Tipp,ich werde es annehmen
 

tobit

Grünschnabel
hab es so bearbeitet aber er setzt die Bit auf 0
irgendwie tut es sich auch nichts
Code:
#include<iostream>

#include<cmath>
#include <limits.h>

using namespace std;

int main()
{
    int einsen=0;
    unsigned int Eingabe=0;

    const int bits_int = sizeof(int)*CHAR_BIT ;
    int feld[bits_int];
    cout<<"Geben Sie eine Zahl ein: ";
    cin>>Eingabe;
    cout<<Eingabe<<":";
    for (int i=bits_int-1; i >= 0; i--)
    {
        feld[i]=Eingabe%2;
        Eingabe/=2;
    }
    for(int i=0; i<bits_int;i++)
    {
        cout<<feld[i];
        if (feld[i]== 1){

        ++einsen;
        }
        }
        
        cout<<'\n'<<"Das Bitmuster hat "<< einsen<<" Einsen.";
     int val ;
        int n=bits_int;
val |= (1 << n); // Setzt das n-te Bit auf 1
val &= ~(1 << n); //Setzt das n-te Bit auf 0 (AND NOT)

        cout<<'\n'<<"Welches Bit(0-31 von rechts beginnend)soll geandert werden? ";
        cin>>n;
        cout<<"Auf welchen Wert(0 oder 1)soll das Bit gesetzt werden "<<val;
 
    return 0;}
 

cwriter

Erfahrenes Mitglied
hab es so bearbeitet aber er setzt die Bit auf 0
irgendwie tut es sich auch nichts
Das meinst du wohl hoffentlich nicht ernst.

Schlimm genug, dass du meinen Code kopiert hast; die wenigen Veränderungen, die du vorgenommen hast, sind falsch. Warum nimmst du das = 0 (die Definition des Werts) raus?

Warum liest du das n erst später ein? Warum setzt du das 32. Bit? Dieses gibt es nicht - n muss in [0,31] sein. Was du da machst, ist undefined behavior.

Und dass sich nichts tut, könnte damit zusammenhängen, dass du val auch gar nicht ausgibst. Macht aber nichts, die Ausgabe wäre eh nichtssagend, da du ja den Wert von val nicht kennst.

Du hast ja nicht einmal daran gedacht, eine 2. Eingabe für den Wert zu verlangen.

Und dann ist nicht einmal dein Gemurmel in irgendeiner Form wertvoll. Ja, du hast wahrscheinlich ganze 5 Minuten mit dem Code verbracht, meinen "Beispielcode" reinkopiert (dass jede einzelne Zeile losgelöst von der anderen ist und NICHT alle gleichzeitig kopiert werden sollen hast du natürlich auch nicht gesehen) und dann einfach wieder hier irgendwas gepostet.

Die Formatierung ist noch immer unschön. Warum nimmst du dir nicht einfach mal eine Minute Zeit, alles schön einzurücken. (Oder lass es halt die IDE mit einem AutoFormat/PrettyPrint machen). Dann macht es dir vielleicht auch Spass, mal den eigenen Code zu lesen.

*Seufz*

Ich helfe ja gerne, aber eine der Grundlagen ist schlicht, den Anderen zu respektieren. Und dazu gehört für mich auch, dass man sich ein bisschen Mühe gibt. Snipplets zu kopieren ist ok, aber bitte nicht einfach irgendwohin. Mache dir Gedanken dazu. Warum hat dieses Statement diesen Effekt? Was bedeutet eigentlich "<<"? (=> Google "C << operator"). Wenn das nach einer Recherche noch unklar ist: Gar kein Problem, frage ruhig spezifisch danach. Am besten ist immer, wenn du sagst, was du verstehst und was noch nicht.
Einfach einen krummen Satz und einen kaputten Code hinschmeissen ist nicht. Wir können den Code schon verbessern, kein Ding. Es ist schwieriger, herauszufinden, wo deine Unklarheiten sind. Aber diese aufzuklären hilft dir am Ende mehr, als nur ein fertiger Code. Aber da das mühsamer ist, erwarten wir auch ein bisschen Mithilfe: Klare Fragen und Selbststudium.

Also machen wir einen Deal: Du siehst nach, warum das Bitsetzen/-entfernen so funktioniert. Wenn Unklarheiten bestehen, nachfragen. Ansonsten: Schreibe den Code so, dass du alle benötigten Werte einliest und nachdem alles eingelesen wurde, wieder alles ausgibst. So lässt sich prüfen, ob du wirklich alle benötigten Werte hast.
Dann arbeitest du auf diesen Werten. Wenn die Ausgabe von den Erwartungen abweicht, überlege dir, weshalb. Wenn diese Vermutung sich nicht bestätigt, gib sie hier trotzdem an. So können wir den Gedankengang nachverfolgen und den Denkfehler finden.

Meine Seite des Deals: Wenn du den Anweisungen mehr oder weniger (sinngemäss) folgst, dann helfe ich dir weiter.
Ansonsten ist mir meine Zeit ehrlich gesagt zu schade.

Gruss
cwriter
 

Technipion

Erfahrenes Mitglied
C:
cout<<'\n'<<"Das Bitmuster hat "<< einsen<<" Einsen.";
     int val ;
        int n=bits_int;
val |= (1 << n); // Setzt das n-te Bit auf 1
val &= ~(1 << n); //Setzt das n-te Bit auf 0 (AND NOT)

        cout<<'\n'<<"Welches Bit(0-31 von rechts beginnend)soll geandert werden? ";
        cin>>n;
        cout<<"Auf welchen Wert(0 oder 1)soll das Bit gesetzt werden "<<val;
Au weia :eek:

Man kann sich ja in letzter Zeit echt nicht so sicher sein hier im Forum, aber hier würde ich einfach sagen: cwriter, don't feed the troll...
 

Neue Beiträge