2016-04-05 9 views
0

Ich habe ein Koordinatenpaar von Werten, die jeweils von [0,15] reichen. Fürs Erste kann ich eine vorzeichenlose, aber seit 16 x 16 = 256 mögliche Koordinatenpositionen verwenden, dies repräsentiert auch alle binären und hexadezimalen Werte von 1 Byte. Um den Speicher kompakt zu halten, bevorzuge ich die Verwendung eines BYTE oder eines unsignierten Chars. Was ich mit diesem Koordinatenpaar machen möchte, ist:Kombinieren von 2 Hex-Werten in 1 Hex-Wert

Nehmen wir an, wir haben ein Koordinatenpaar mit dem Hexadezimalwert [0x05,0x0C], ich möchte, dass der Endwert 0x5C ist. Ich würde auch gerne das Gegenteil tun, aber ich denke, ich habe bereits eine Antwort mit einer Lösung für das Gegenteil gefunden. Ich dachte über die Verwendung von & oder | Ich vermisse etwas, denn ich bekomme nicht die richtigen Werte.

Aber wie ich dies tippte und auf das Gegenteil davon schaute: das ist, was ich gefunden habe und es scheint zu arbeiten.

byte a = 0x04; 
byte b = 0x0C; 

byte c = (a << 4) | b; 

std::cout << +c; 

Und der Wert, der gedruckt wird, ist 76; was zu hex konvertiert ist 0x4C.

Seit ich die Berechnung dafür herausgefunden habe, gibt es einen effizienteren Weg?

EDIT

Nach einigem Testen des Betriebs macht die ersten beiden zu kombinieren, ist mir um den richtigen Wert zu geben, aber wenn ich die umgekehrte Operation als solche so mache:

byte example = c; 
byte nibble1 = 0x0F & example; 
byte nibble2 = (0xF0 & example) >> 4; 

std::cout << +nibble1 << " " << +nibble2 << std::endl; 

Es ist Ausdruck . Ist das richtig oder sollte das ein Problem sein? Im schlimmsten Fall kann ich die Werte umbenennen, um anzuzeigen, um welchen Koordinatenwert es sich handelt.

EDIT

Nach ein wenig darüber nachgedacht und einige der Vorschläge hatte ich den umgekehrten Vorgang, dies zu ändern:

byte example = c; 
byte nibble1 = (0xF0 & example) >> 4; 
byte nibble2 = (0x0F & example); 

std:cout << +nibble1 << " " << +nibble2 << std::endl; 

Und diese ausdruckt 4 12, die das ist richtige Reihenfolge von was ich suche!

+0

Ich denke, es ist nicht. Bitte beachten Sie auch, was passiert, wenn 'b> 0x0F'. Wenden Sie eine 4-Bit-Maske an oder behandeln Sie sie irgendwie für "a" und "b". Außerdem ist "0x0C" tatsächlich "12". – LogicStuff

Antwort

1

Zunächst, seien Sie vorsichtig, es gibt tatsächlich 17 Werte im Bereich 0..16. Ihre Werte sind wahrscheinlich 0..15, denn wenn sie tatsächlich von 0 bis 16 reichen, können Sie nicht jedes mögliche Koordinatenpaar eindeutig in einem einzigen Byte speichern.

Der Code-Extrakt, den Sie eingereicht haben, ist ziemlich effizient, Sie verwenden Bit-Operatoren, die die schnellste Aufgabe sind, die Sie einem Prozessor stellen können.

Für das "Reverse" (Aufteilen Ihres Bytes in zwei 4-Bit-Werte) haben Sie recht, wenn Sie über die Verwendung von & nachdenken. Wenden Sie einfach eine 4-Bit-Schicht zur richtigen Zeit an.

+0

Ja, sie sind 0-15; Ich habe das bemerkt und die Bearbeitung bereits gemacht, bevor du eine Antwort gegeben hast. –

+0

Ich werde diese beiden Berechnungen in einer meiner Datenstrukturen verwenden, um eine Nachschlagetabelle von Koordinatenpaaren zu erstellen. Bevor ich diese anwenden kann, muss ich den Algorithmus implementieren, um alle Koordinatenpaare zu einem Array von 256 Werten zu generieren, wobei die Reihenfolge selbst auf einer bestimmten Struktur beruht.Ich habe damit gekämpft und ich habe eine Frage dazu hier: http://stackoverflow.com/questions/36416290/implementing-a-lookup-table sobald ich in der Lage bin, diese Nachschlagetabelle zu erstellen, sollte ich dann dazu in der Lage sein wandle die aktuelle Struktur in "Byte" um und komprimiere sie, um sie dann zu extrahieren. –