8 Stimmen

Die sauberste Art, zwei Shorts zu einem int zu kombinieren

Ich habe zwei 16-Bit-Shorts (s1 und s2) und versuche, sie zu einer einzigen 32-Bit-Ganzzahl (i1) zusammenzufassen. Gemäß der Spezifikation, mit der ich zu tun habe, ist s1 das höchstwertige Wort und s2 das niederwertige Wort, und das kombinierte Wort scheint vorzeichenbehaftet zu sein. (d.h. das oberste Bit von s1 ist das Vorzeichen.)

Wie lassen sich s1 und s2 am saubersten kombinieren?

Ich dachte an etwas wie

const utils::int32 i1 = ((s1<<16) | (s2));

tun würde, und es scheint zu funktionieren, aber ich bin besorgt über die Linksverschiebung eines Kurzschlusses um 16.

Ich bin auch an der Idee interessiert, eine Gewerkschaft mit der Arbeit zu beauftragen. Haben Sie eine Meinung dazu, ob dies eine gute oder schlechte Idee ist?

0voto

Tyler McHenry Punkte 71707

Sie möchten data.first in einen int32 umwandeln, bevor Sie die Verschiebung durchführen, da sonst die Verschiebung den Speicher überlaufen lässt, bevor sie eine Chance bekommt, automatisch befördert zu werden, wenn sie kombinierten Daten zugewiesen wird.

Versuchen Sie es:

const utils::int32 combineddata = (static_cast<utils::int32>(data.first) << 16) | data.second;

Dies setzt natürlich voraus, dass data.first und data.second Typen sind, die garantiert genau 16 Bit lang sind, sonst gibt es größere Probleme.

Ich verstehe deine Aussage nicht: "Wenn data.second zu groß wird, wird der | nicht berücksichtigen, dass es sich bei beiden um Shorts handelt."

Bearbeiten: Und Neil hat absolut Recht, was die Unterschriftsfähigkeit angeht.

-1voto

plinth Punkte 46829

Die Verwendung einer Union zur Erledigung dieser Aufgabe scheint eine gute Wahl zu sein, stellt jedoch aufgrund der Endian-Unterschiede zwischen den Prozessoren ein Problem der Portabilität dar. Es ist machbar, aber Sie müssen darauf vorbereitet sein, Ihre Union auf der Grundlage der Zielarchitektur zu ändern. Bit-Shifting ist portabel, aber bitte schreiben Sie eine Funktion/Methode, die dies für Sie erledigt. Inline, wenn Sie möchten.

Was die Vorzeichenbehaftung der Shorts angeht, so ist bei dieser Art von Operation die Bedeutung entscheidend, nicht der Datentyp. Mit anderen Worten, wenn s1 und s2 als zwei Hälften eines 32-Bit-Wortes interpretiert werden sollen, ist das Setzen von Bit 15 nur dann von Bedeutung, wenn Sie etwas tun, was dazu führen würde, dass s2 vorzeichenerweitert wird. Siehe Mark Ransoms Antwort, die besser sein könnte als

inline utils::int32 CombineWord16toLong32(utils::int16 s1, utils::int16 s2)
{
    return ((s1 <<16) | (s2 & 0xffff));
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X