Frage

Original Frage geändert.

Ich möchte wiederum von der linken Bit eines Short-Wert bitweise (& H8000) und lassen Sie die anderen Bits, wie sie sind.

Dim x = BitConverter.GetBytes(Short.MaxValue Or &H8000)
Dim z = BitConverter.ToInt16(x, 0)

Gibt es keinen kürzeren Weg mit Bitoperatoren?

Wenn ich

Dim a = Short.MaxValue Or &H8000

ich einen Compiler-Fehler, Cuz es nach oben geht, statt sie zu negieren.

War es hilfreich?

Lösung

Das ist, weil .NET verwendet Zweierkomplement, nicht unterzeichnet Größe. Negieren, müssen Sie Flip alle die Bits und dann hinzufügen.

Bitte verwenden Sie einfach die einstellige minus. Bitte ... Bitte, bitte.

EDIT: Wenn aus irgendeinem seltsamen Grund, warum Sie dies tun musste, mit bitweise Operationen, würden Sie haben, dies zu tun:

Dim somewhatCorrect = (Short.MaxValue xor Short.MinValue) + 1;

was natürlich noch nicht bitweise, weil Zweier-Komplement-Negation nicht effizient mit Bitoperatoren erfolgen.

EDIT2: Und hier ist eine einstellige Minus:

Dim correct = -Short.MaxValue;

EDIT3: Als Antwort auf editierte Frage :

Dim x As Short = 42
Dim xWithHighBitOn = x Or Short.MinValue

Andere Tipps

Zwei-Komplement

Dim testV As Short = &HD555S 'a test value

Dim twosC As Short 'twos comp

twosC = (testV Xor &HFFFFS) + 1S 'reverse the bits, add 1

Ändern höchstwertigen Bits

twosC = twosC Xor &H8000S
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top