2013-02-18 168 views
5

我有一個字符串十六進制值,我需要用2的補碼來表示它。表示二進制補碼的十六進制值

string hx = "FF00"; 

我所做的是,將其轉換爲二進制:

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

然後反轉,但我不能使用NOT操作。

是否有任何簡短的方法來反轉位,然後加1(2的補碼操作)?

+0

http://stackoverflow.com/questions/12942904/calculate-twos-complement-checksum-of-hexadecimal-string – 2013-02-18 03:34:07

回答

4

答案可能取決於是否或者不是值的位寬度對你很重要。

簡短的回答是:

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" 

h值爲然後 「FFFF0100」,這是在32位2的HX的補碼。如果你期待「100」,那麼你需要使用16位計算:

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" 

記住,uintUInt32ushort別名UInt16類型的別名。爲了清楚這種類型的操作,你最好使用顯式名稱。

+0

謝謝科裏..這正是我一直在尋找。 – Liban 2013-02-18 04:13:30

3

兩個complment是非常簡單的:

int value = 100; 

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

//Now value is -100 

記住兩個補體系統,需要翻轉並添加加1

在十六進制:

int value = 0x45; 

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

如果數值在十六進制中,該怎麼辦?我需要轉換爲'int'嗎? – Liban 2013-02-18 03:58:47

+0

將文字改爲十六進制,看不到問題。 – 2013-02-18 03:59:03

+0

@Liban是否將字符串轉換爲表示形式的問題? – 2013-02-18 04:02:33