Wie komm ich an die Bits ?
-
Ich glaub mir dämmerts grad...
Ein char in der Datei entspricht einem Byte, stimmts ? Die Bits sind ja nur die acht Stellen der binären Darstellung der Zahl die das Byte repräsentiert. Ist das so richtig ? Die Datei besteht aus lauter achtstelligen binären Zahlen, wobei jede Zahl ein bestimmtes Zeichen (z.B. im Editor) bedeutet.
-
Zeichen sind Bytes
-
Ich glaube dann hab ichs kapiert. Danke an alle !
Nur diese eine Zeile verstehe ich nicht:
if(cByte & 1)
Wieso steht dieses bitweise UND da ? Was bedeutet die Zeile ?
-
es wird verglichen ob das letzte bit gesetzt ist oder nicht. z.B 101101 - bit gesetzt 101100 - nicht gesetzt usw
-
Aber was hat denn das bitweise UND mit dem Prüfen des letzten Bits eines Bytes zu tun ? Und wieso das letzte und nicht das erste ?
-
Na ganz einfach:
1 -> 0000 0001
1 -> 0000 0001 UND-Verknuepft
--------------
0000 0001 = Das letzte bit ist gesetzt1 -> 0000 0001
2 -> 0000 0010 UND-Verknuepft
--------------
0000 0000 = Das letzte bit ist nicht gesetztmfg
v R
-
virtuell Realisticer schrieb:
Na ganz einfach:
1 -> 0000 0001
1 -> 0000 0001 UND-Verknuepft
--------------
0000 0001 = Das letzte bit ist gesetzt1 -> 0000 0001
2 -> 0000 0010 UND-Verknuepft
--------------
0000 0000 = Das letzte bit ist nicht gesetztmfg
v RAch soooooooooooooo ! Na klar ! Da stand ich aber voll auf dem Schlauch. Danke für eure Geduld
-
Jetzt hab ich das Programm geschrieben, aber er gibt am Ende immer noch zehn Nullen aus. Kann das vielleicht an dem while(!file.eof()) liegen ? Kommt nach dem letzten Zeichen in der Datei doch noch was ?
-
Ich habe das Gefühl, dass bei der Ausgabe hinter jedes letzte Bit eines Bytes noch eine Null gehängt wird, wieso ?
-
Clyde schrieb:
Ich habe das Gefühl, dass bei der Ausgabe hinter jedes letzte Bit eines Bytes noch eine Null gehängt wird, wieso ?
1.) Warum hast du das Gefühl?
2.) Zeig doch mal Code wenn dir jemand helfen soll...
-
Das ist so die Rohversion von meinem Programm:
#include <iostream.h> #include <fstream.h> int main () { ifstream read("datei.txt"); char bits[8]; char byte; cout<<endl; if(read!=0) { while(!read.eof()) { read>>byte; if(!read.fail()) { for(int i=0;i<8;++i) { if(byte & 1) bits[i]='1'; else bits[i]='0'; byte>>=1; } for(int i=0;i<8;++i) cout<<bits[i]; } else { cout<<"Fehler beim Lesen der Datei !"<<endl<<endl; return 1; } } cout<<endl<<endl; } else { cout<<"Datei nicht gefunden !"<<endl<<endl; } return 0; }
-
Nu nimmste mal dein Visual C++ oder was du auch immer als Programmierumgebung hast, und schmeisst den Debugger an. Lies mal den Verlinkten Artikel zum Thema Debuggen. Ist zwar Borlandspezifisch aber die Vorgehensweisen sind in jeder IDE realtiv ähnlich.
noch ne Anmerkung zu JFK's Code: Im Prinzip wärs eleganter die Bitmaske statt der Daten zu shiften, da dann die Ursprungsdaten nicht zerstört werden.
-junix
-
Nö, ist doch im Prinzip richtig (mal abgesehen davon, dass es nicht kompilieren wird)
Schreibe oben anstatt...
#include <iostream.h> #include <fstream.h>
...einfach...
#include <iostream> #include <fstream> using namespace std;
Und siehe da, es kompiliert.
-
@junix: da haste wohl recht. Aber es sollte ja einfach sein und nicht elegant.
-
MaSTaH schrieb:
Nö, ist doch im Prinzip richtig
Wieso beschleicht mich nur das Gefühl, dass die Pre-Increments bei den beiden For was mit dem merkwürdigen Verhalten zu Tun haben?
Ausserdem wärs eleganter, das char-Array um 1 Element zu erhöhen, mit Null zu initialisieren (memset) und dann die String-Operationen zu verwenden für die Ausgabe (o:
@JFK: Elegant <> Not(Einfach) (o:
Ne im ernst, das Schieben der Maske hätte die Lösung nicht zwingend verkompliziert (o:-junix
-
junix schrieb:
MaSTaH schrieb:
Nö, ist doch im Prinzip richtig
Wieso beschleicht mich nur das Gefühl, dass die Pre-Increments bei den beiden For was mit dem merkwürdigen Verhalten zu Tun haben?
Ist doch Jacke wie Hose ob ich in diesem Fall bei BuiltIns ein pre increment oder ein post increment mache (C++ FAQ).
The for statement: for(for-init-statement; conditionopt ; expressionopt) { statement } is equivalent to: { for-init-statement while(condition) { statement expression } }
Es dürfte also (in diesem Fall bei built-ins) nichts ausmachen
. btw gibt das Programm bei mir keine 0 zuviel aus.
-
MaSTaH schrieb:
junix schrieb:
MaSTaH schrieb:
Nö, ist doch im Prinzip richtig
Wieso beschleicht mich nur das Gefühl, dass die Pre-Increments bei den beiden For was mit dem merkwürdigen Verhalten zu Tun haben?
Ist doch Jacke wie Hose ob ich in diesem Fall bei BuiltIns ein pre increment oder ein post increment mache (C++ FAQ).
The for statement: for(for-init-statement; conditionopt ; expressionopt) { statement } is equivalent to: { for-init-statement while(condition) { statement expression } }
Hmmm stimmt, hatte mich da vertan.
-junix
-
Hab sowas auch schonmal geschrieben:
#include <iostream.h> #include <fstream.h> #include <math.h> int main() { char buff,bits[8]; ifstream datei("datei.txt"); if(datei) { while(!datei.eof()) { datei>>buff; if(!datei.eof()) { for (int i=0;i<=7;i++) { if(buff-pow(2,7-i)>=0) { buff-=pow(2,7-i); bits[i]='1'; } else bits[i]='0'; cout << bits[i]; } cout << endl; } } } else cout << "Dateifehler !"; datei.close(); return 0; }
-
Danke für diesen Beitrag. Das ist aber so ziemlich das unperformanteste.... Bei Binärzahlen brauch ich doch kein POW!?!?!? Da schieb ich die Bits und gut ist. Jede Bitverschiebung nach links entspricht einem ^2.
-
Leute ihr müsst mir nochmal helfen. Ich hab ein bisschen nachgedahct, aber diese eine Schleife verstehe ich immer noch nicht richtig:
for(int i=0;i<8;++i) { if(byte & 1) bits[i]='1'; else bits[i]='0'; byte>>=1; }
1.: Wieso wird mit if(byte & 1) gerade das letzte Bit eines Bytes auf 1 geprüft ?
2.: Was genau macht byte>>=1 ? Was wandert da wohin ?