Dezimal Zahl -> Bytes
-
Hallo,
ich kriege von meinem LPT Port beim Abfragen eine Zahl z.B. 90 ausgegeben, nun würde ich gerne eine Funktion schreiben die mir ausgibt aus welchen Bytes sie besteht, also hier aus: 64+16+8+2.
Gibt es dafür eine Funktion etc.
Oder muss man das selber schreiben, wenn ja wie, ich finde irgendwie keinen Ansatz dafür.Mfg. BNS
-
Anscheinend weißt du nicht was ein Byte ist.
-
Schätze er meint die Wertigkeit der einzelnen Bits.
Die 90 von oben wäre also Binär 10110101| 0| 1| 1| 0| 1| 0 64|32|16| 8| 4| 2| 1
-
Hab es wohl Falsch formuliert ich will wenn ich die Zahl 90 habe eine Ausgabe von:
64
16
8
2
bekommen ohne tausende von Schleifen und if Befehlen zu machen.
-
Hi,
Na dann würd ich doch mal Modulo- (Rest-) Berechnung vorschlagen
(90%64 = 26) = 1
(26%32 = 26 (ungültig)) = 0
(26%16 = 10) = 1
usw...da kannst dir sogar ne schleife 'drumrumbauen'
mfg, Micha
//Edit: Er meint schon Byte, aber dann müsste es so aussehen: 01011010
-
unsigned bit = 0x80000000; // für sizeof(unsigned) == 4 do { if(bit & meineZahl) std::cout << bit << std::endl; } while(bit >>= 1);
-
Ok ich habe aber ein Problem:
if (90 % 64 == 1) { // }es passier aber nicht auch bei 0;false;true;1 oder 26 nicht, also ich verstehe nicht ganz wie man das machen muss mit Modulo.
-
Hi,
du musst eigentlich nur überprüfen ob der Berechnungswert mit dem Anfangswert übereinstimmt.
Also:
int d_start = 90, new_d_start, b_wert = 128; for (int i = 0; i < 8; i++) { new_d_start = d_start % b_wert; if (new_d_start != d_start) { ListBox1->Items->Add(b_wert); //Ausgabe 64, 16... d_start = new_d_start; // Label1->Caption = Label1->Caption + "1"; << Binärausgabe } else { // Label1->Caption = Label1->Caption + "0"; << Binärausgabe } b_wert = b_wert / 2; }mfg, Micha
-
HI, ich habe anstatt eine ListBox es so gemacht:
if (Byte1 >= 255) { d_start = 255; } if (Byte1 <= 128 && Byte1 > 64) { d_start = 128; } if (Byte1 <= 64 && Byte1 > 32) { d_start = 64; } if (Byte1 <= 32 && Byte1 > 16) { d_start = 32; } if (Byte1 <= 16 && Byte1 > 8) { d_start = 16; } if (Byte1 <= 8 && Byte1 > 4) { d_start = 8; } if (Byte1 <= 4 && Byte1 > 2) { d_start = 4; } if (Byte1 <= 2 && Byte1 > 1) { d_start = 2; } for (int i = 0; i < 8; i++){ new_d_start = d_start % b_wert; if (new_d_start != d_start) { switch (b_wert) { case 1: Button1->Click(); break; case 2: Button2->Click(); break; case 4: Button3->Click(); break; case 8: Button4->Click(); break; case 16: Button5->Click(); break; case 32: Button6->Click(); break; case 64: Button7->Click(); break; case 128: Button8->Click(); break; } d_start = new_d_start; // Label1->Caption = Label1->Caption + "1"; << Binärausgabe } else { // Label1->Caption = Label1->Caption + "0"; << Binärausgabe } b_wert = b_wert / 2; }Die Buttons etc. ist alles richtig doch er macht mir jedes mal falsche Buttons an egal bei welchem Code.
Wo liegt der Fehler?Mfg. BNS
-
Hi,
int d_start = 90, new_d_start, b_wert = 128, Byte1 = 22; if (Byte1 >= 255) { d_start = 255; } if (Byte1 <= 128 && Byte1 > 64) { d_start = 128; } if (Byte1 <= 64 && Byte1 > 32) { d_start = 64; } if (Byte1 <= 32 && Byte1 > 16) { d_start = 32; } if (Byte1 <= 16 && Byte1 > 8) { d_start = 16; } if (Byte1 <= 8 && Byte1 > 4) { d_start = 8; } if (Byte1 <= 4 && Byte1 > 2) { d_start = 4; } if (Byte1 <= 2 && Byte1 > 1) { d_start = 2; } for (int i = 0; i < 8; i++) { new_d_start = d_start % b_wert; if (new_d_start != d_start) { switch(b_wert) { case 1: ShowMessage("1"); break; case 2: ShowMessage("2"); break; case 4: ShowMessage("4"); break; case 8: ShowMessage("8"); break; case 16: ShowMessage("16"); break; case 32: ShowMessage("32"); break; case 64: ShowMessage("64"); break; case 128: ShowMessage("128"); break; } d_start = new_d_start; // Label1->Caption = Label1->Caption + "1"; << Binärausgabe } else { // Label1->Caption = Label1->Caption + "0"; << Binärausgabe } b_wert = b_wert / 2; }Also das funktioniert bei mir, wenn ich zum Beispiel 22 als Byte1 eingebe zeigt er mir am Ende 32 an ... also das passt schon!
Die Funktionsweise an sich ist aber verkehrt, weil 22 setzt sich aus 16, 4 und 2 zusammen! Deswegen versteh ich deine Routine nicht ganz.
Ich würde einfach abkürzen auf:
int d_start = 90, new_d_start, b_wert = 128, Byte1 = 22; if (Byte1 > 255) { d_start = 255; } for (int i = 0; i < 8; i++) { new_d_start = d_start % b_wert; if (new_d_start != d_start) { switch(b_wert) { case 1: ShowMessage("1"); break; case 2: ShowMessage("2"); break; case 4: ShowMessage("4"); break; case 8: ShowMessage("8"); break; case 16: ShowMessage("16"); break; case 32: ShowMessage("32"); break; case 64: ShowMessage("64"); break; case 128: ShowMessage("128"); break; } d_start = new_d_start; // Label1->Caption = Label1->Caption + "1"; << Binärausgabe } else { // Label1->Caption = Label1->Caption + "0"; << Binärausgabe } b_wert = b_wert / 2; }Alles kleiner/gleich 255 setzt sich sowieso aus 128,64,32,16,8,4,2,1 zusammen.
mfg, Micha
-
ok, vielen danke es funktioniert.