2013-02-18 6 views
5

私は文字列の16進数の値を持っています。これを2の補数で表現する必要があります。2の補数で16進値を表現する

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

は、それを反転、私はNOT演算子を使用することができませんでした:私はバイナリに変換している何をしたか

string hx = "FF00"; 

ビットを反転して1(2の補数演算)を加算する方法はありますか?

+0

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

答えて

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の値は、HXの32ビットの2の補数である "FFFF0100" です。 uintUInt32UInt16タイプ別名ushortの別名であることを念頭に置いて

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" 

クマ:あなたはその後、「100」を期待していた場合は、16ビットの計算を使用する必要があります。このタイプの操作を明確にするために、明示的な名前を使用するほうがよいでしょう。

+0

ありがとうCorey ..まさに私が探していたものでした。 – Liban

3

二complmentは本当に簡単です:

int value = 100; 

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

//Now value is -100 

2つの補体系が反転して追加プラス六角1.

必要であることを忘れないでください:

int value = 0x45; 

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

値が16進数の場合はどうなりますか? 'int'に変換する必要がありますか? – Liban

+0

リテラルを16進数に変更してください。問題は表示されません。 –

+0

@Liban文字列を表現に変換する際に問題がありますか? –

関連する問題