2013-02-18 6 views
5

Ich habe eine Zeichenfolge Hex-Wert, und ich muss es in Zweierkomplement auszudrücken.Hexadezimalwert in Zweierkomplement ausgedrückt

string hx = "FF00"; 

, was ich tat, ist, es zu binärer Umwandlung:

string h = Convert.ToString(Convert.ToInt32(hx, 16), 2); 

dann invertiert, aber ich kann den NOT Operator nicht verwenden.

Gibt es einen kurzen Weg, um die Bits zu invertieren und dann 1 (2-Komplement-Operation) hinzuzufügen?

+0

http://stackoverflow.com/questions/12942904/calculate-twos-complement-checksum-of-hexadecimal-string –

Antwort

4

Die Antwort könnte davon abhängen, ob oder nicht die Bitbreite des Wertes ist wichtig für Sie.

Die kurze Antwort lautet:

string hx = "FF00"; 
uint intVal = Convert.ToUInt32(hx, 16);  // intVal == 65280 
uint twosComp = ~v + 1;      // twosComp == 4294902016 
string h = string.Format("{0:X}", twosComp); // h == "FFFF0100" 

Der Wert h ist dann "FFFF0100", die das Komplement 32-Bit 2 von hx. Wenn Sie erwarteten ‚100‘, dann müssen Sie 16-Bit-Berechnungen verwenden:

string hx = "FF00"; 
ushort intVal = Convert.ToUInt16(hx, 16); // intVal = 65280 
ushort twosComp = (ushort)(~v + 1);   // twosComp = 256 
string h = string.Format("{0:X}", twosComp); // h = "100" 

Beachten Sie, dass uint ist ein Alias ​​für UInt32 und ushort Aliase der UInt16 Typ. Um die Übersichtlichkeit bei dieser Art von Operation zu erhöhen, sollten Sie die expliziten Namen besser verwenden.

+0

Danke Corey .. es war genau das, was ich suchte. – Liban

3

Zwei complment ist wirklich einfach:

int value = 100; 

value = ~value // NOT 
value = value + 1; 

//Now value is -100 

Denken Sie daran, dass ein zwei Komplementsystems erfordert Umkehren und das Hinzufügen von plus 1.

In hex:

int value = 0x45; 

value = ~value // NOT 
value = value + 1; 
+0

Was ist, wenn der Wert in Hex ist? muss ich in 'int' konvertieren? – Liban

+0

Ändern Sie das Literal in Hex, das Problem nicht zu sehen. –

+0

@Liban Konvertiert die Zeichenfolge in ihre Darstellung ein Problem? –

Verwandte Themen