4 Stimmen

Gibt es einen einfachen Weg, um von einem 32-Bit-Integer in einen 16-Bit-Integer umzuwandeln?

Ich habe ein 32-Bit-Integer und möchte nur die untere Hälfte dieser Variablen ansprechen. Ich weiß, dass ich in ein Bit-Array und in Int16 konvertieren kann, aber gibt es einen einfacheren Weg, das zu tun?

8voto

Will Dean Punkte 38365

Wenn Sie nur die untere Hälfte möchten, können Sie diese einfach umwandeln: (Int16)my32BitInt

Im Allgemeinen, wenn Sie Bitmuster auf diese Weise erweitern/kürzen, müssen Sie vorsichtig sein mit den Vorzeichen - vorzeichenlose Typen können weniger Überraschungen verursachen.

Wie in den Kommentaren erwähnt - wenn Sie Ihren Code in einen 'checked' Kontext eingeschlossen haben oder Ihre Compileroptionen so geändert haben, dass der Standardwert 'checked' ist, dann können Sie eine Nummer nicht so ohne Exception abkürzen, wenn nicht alle Bits, die verworfen werden, Null sind - in dieser Situation müssten Sie Folgendes tun:

(UInt16)(my32BitInt & 0xffff)

(Die Option, vorzeichenbehaftete Typen zu verwenden, entfällt in diesem Fall, weil Sie & 0x7fff verwenden müssten, was dann nur 15 Bits behält)

2voto

BRAHIM Kamel Punkte 13037

Nutzen Sie einfach diese Funktion

Convert.ToInt16()

oder einfach

(Int16)wertalsint

1voto

Soner Gönül Punkte 93790

Sie können implizites Gespräch zum Int16 verwenden, wie zum Beispiel;

(Int16)2;

aber seien Sie vorsichtig, wenn Sie das tun. Denn Int16 kann nicht alle möglichen Werte von Int32 halten.

Zum Beispiel wird dies nicht funktionieren;

(Int16)2147483683;

weil Int16 32787 als maximalen Wert halten kann. Sie können das unchecked (C# Reference) Schlüsselwort in solchen Fällen verwenden.

1voto

vcsjones Punkte 134300

Wenn Sie eine nicht überprüfte Operation erzwingen, sollte ein Cast funktionieren:

int r = 0xF000001;
short trimmed = unchecked((short) r);

Dies wird den Wert von r abschneiden, um in ein Short zu passen.

Wenn der Wert von r immer in ein short passen sollte, können Sie einfach einen normalen Cast durchführen und eine Ausnahme auslösen lassen.

0voto

Luaan Punkte 59767

Nun gut, zunächst einmal stellen Sie sicher, dass Sie den Wert tatsächlich signiert haben möchten. uint und ushort sind aus einem Grund vorhanden. Dann:

ushort ret = (ushort)(val & ((1 << 16) - 1));

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