Einlesen der ersten zwei Ziffern einer Int-Variable möglich?
-
Hallo Leute,
ich soll einen achstelligen Hexadezimalcode (RGBA-Hex-Code) eingeben lassen und dann diesen, gesplittet in seine vier Zweierbestandteile wieder ausgeben lassen.
Mein Problem liegt bei Folgendem: die Eingabe soll als Zahl erfolgen (der Hinweis, ich solle den Manipulator
cin >> hex;verwenden hat mich da drauf gebracht). Wie ich von einem String einzelne Teile, also hier zwei Zeichen, abschneide, weiss ich.
string text, text_zeichen text_zeichen = text.substr(0,2)Aber wie mache ich das mit einer Zahlen-Variable? Ist es hier möglich, eine Anweisung zu geben, so dass ich immer nur eine bestimmte Anzahl an Stellen in eine neue Variable einlese?
Vielen Dank schonmal!

-
Du könntest entweder die Zahl sooft durch 10 Teilen, bis nur 2 Ziffern über sind, oder alternativ einen String einlesen, zuschneiden und via stringstream in einen int speichern.
-
Durch Rechnen. Das geht mit Bitverschiebungen und logischem UND ganz einfach. Hier ein Tipp: Stellenwertsystem
-
Genau, das mit dem String habe ich auch versucht. Und zwar folgendermaßen:
string rgba_hex, rot_str, gruen_str, blau_str, alpha_str; int rot_int; cout << "Bitte geben Sie den hexadezimalen RGBA-Wert ein: "; cin >> hex >> rgba_hex; rot_str = rgba_hex.substr(0,2); gruen_str = rgba_hex.substr(2,2); blau_str = rgba_hex.substr(4,2); alpha_str = rgba_hex.substr(6,2); cout << "Kontrolle substring rot: " << rot_str << endl; cout << "Kontrolle substring gruen: " << gruen_str << endl; cout << "Kontrolle substring blau: " << blau_str << endl; cout << "Kontrolle substring alpha: " << alpha_str << endl; sstr << rot_str; sstr >> rot_int; cout << "Kontrolle: rot : " << hex << rot_int << endl;Nur leider kommt bei meiner Ausgabe absoluter Bullshit raus, das Problem liegt denke ich daran, dass ich versuche einen hex-Wert in die Variable zu speichern.
-
Vielen Dank, sepp_J für den Tipp.
Ich probiere nun schon seit Stunden, wie das klappen könnte, und komme zu nix. Es wäre deshalb total nett, wenn du kurz hinschreiben könntest wie das in meinem Fall lauten würde.
Danke!
-
Naja, du brauchst erstmal einen mindestens 32-bit großen
unsigned integer. Dann liest du den hexadezimal ein und gibst dann die einzelnen bytes aus.typedef unsigned int color_t; // Farbe (ARGB) 32-bit typedef unsigned char channel_t; // Farb"kanal" 8-bit color_t color; std::cin >> std::hex >> color; channel_t blue = (color >> 0) & 0xFF; channel_t green = (color >> 8) & 0xFF; channel_t red = (color >> 16) & 0xFF; channel_t alpha = (color >> 24) & 0xFF;