2013-02-18 14 views
5

Ho un valore esadecimale di stringa e ho bisogno di esprimerlo nel complemento a 2.che esprime il valore esadecimale nel complemento a 2

string hx = "FF00"; 

Io invece ho, convertendolo in binario:

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

quindi invertirla, ma non potrebbe utilizzare l'operatore NOT.

c'è qualche modo per invertire i bit e quindi aggiungere 1 (operazione di complemento a 2)?

+0

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

risposta

4

La risposta potrebbe dipendere dal fatto o no, la larghezza del bit del valore è importante per te.

La risposta breve è:

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" 

Il valore di h è poi "FFFF0100", che è il complemento della HX 32 bit 2 di. Se ti aspettavi '100', allora avete bisogno di utilizzare i calcoli a 16 bit:

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" 

Tenete a mente che uint è un alias per UInt32 e ushort alias il tipo UInt16. Per chiarezza in questo tipo di operazione probabilmente staresti meglio usando i nomi espliciti.

+0

Grazie Corey .. era esattamente quello che stavo cercando. – Liban

3

Due complment è molto semplice:

int value = 100; 

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

//Now value is -100 

ricordi che un sistema a due complemento richiede invertente e aggiungendo più 1.

In esadecimale:

int value = 0x45; 

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

cosa succede se il valore è in hex? devo convertire in 'int'? – Liban

+0

Cambia il letterale in esadecimale, non vedendo il problema. –

+0

@Liban La conversione della stringa nella sua rappresentazione è un problema? –

Problemi correlati