2013-02-18 10 views
5

Mam wartość szesnastkową ciągu i muszę ją wyrazić w uzupełnieniu do 2-ciu.wyrażające wartość szesnastkową w dopełnieniu 2-stowym

string hx = "FF00"; 

co zrobiłem jest, zamieniając go na binarny:

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

następnie odwracając go, ale nie mogłem użyć operatora NOT.

Czy istnieje jakaś krótka droga do odwrócenia bitów, a następnie dodania 1 (operacja uzupełniania 2)?

+0

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

Odpowiedz

4

odpowiedź może zależeć od tego, czy albo nie, szerokość bitowa wartości jest dla ciebie ważna.

Odpowiedź jest krótka:

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" 

Wartość h jest następnie "FFFF0100", który jest 32-bit 2 jest uzupełnieniem HX. Jeśli spodziewaliśmy „100” to trzeba użyć obliczenia 16-bitowych:

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" 

pamiętać, że uint jest aliasem dla UInt32 i ushort aliasów typu UInt16. Dla jasności w tego rodzaju operacji prawdopodobnie lepiej byłoby używać nazw jawnych.

+0

Dzięki Corey .. to było dokładnie to, czego szukałem. – Liban

3

Dwa complment jest naprawdę prosta:

int value = 100; 

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

//Now value is -100 

Pamiętaj, że dwa układ dopełniacza wymaga odwracania i dodanie Plus 1.

W hex:

int value = 0x45; 

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

co, jeśli wartość jest w hex? czy muszę przekonwertować na 'int'? – Liban

+0

Zmień literał na hex, nie widząc problemu. –

+0

@Liban Czy konwersja ciągu znaków na jego reprezentację jest problemem? –

Powiązane problemy