我有一個字符串十六進制值,我需要用2的補碼來表示它。表示二進制補碼的十六進制值
string hx = "FF00";
我所做的是,將其轉換爲二進制:
string h = Convert.ToString(Convert.ToInt32(hx, 16), 2);
然後反轉,但我不能使用NOT
操作。
是否有任何簡短的方法來反轉位,然後加1(2的補碼操作)?
我有一個字符串十六進制值,我需要用2的補碼來表示它。表示二進制補碼的十六進制值
string hx = "FF00";
我所做的是,將其轉換爲二進制:
string h = Convert.ToString(Convert.ToInt32(hx, 16), 2);
然後反轉,但我不能使用NOT
操作。
是否有任何簡短的方法來反轉位,然後加1(2的補碼操作)?
答案可能取決於是否或者不是值的位寬度對你很重要。
簡短的回答是:
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"
記住,uint
是UInt32
和ushort
別名UInt16
類型的別名。爲了清楚這種類型的操作,你最好使用顯式名稱。
謝謝科裏..這正是我一直在尋找。 – Liban 2013-02-18 04:13:30
兩個complment是非常簡單的:
int value = 100;
value = ~value // NOT
value = value + 1;
//Now value is -100
記住兩個補體系統,需要翻轉並添加加1
在十六進制:
int value = 0x45;
value = ~value // NOT
value = value + 1;
如果數值在十六進制中,該怎麼辦?我需要轉換爲'int'嗎? – Liban 2013-02-18 03:58:47
將文字改爲十六進制,看不到問題。 – 2013-02-18 03:59:03
@Liban是否將字符串轉換爲表示形式的問題? – 2013-02-18 04:02:33
http://stackoverflow.com/questions/12942904/calculate-twos-complement-checksum-of-hexadecimal-string – 2013-02-18 03:34:07