私は文字列の16進数の値を持っています。これを2の補数で表現する必要があります。2の補数で16進値を表現する
string h = Convert.ToString(Convert.ToInt32(hx, 16), 2);
は、それを反転、私はNOT
演算子を使用することができませんでした:私はバイナリに変換している何をしたか
string hx = "FF00";
。
ビットを反転して1(2の補数演算)を加算する方法はありますか?
私は文字列の16進数の値を持っています。これを2の補数で表現する必要があります。2の補数で16進値を表現する
string h = Convert.ToString(Convert.ToInt32(hx, 16), 2);
は、それを反転、私はNOT
演算子を使用することができませんでした:私はバイナリに変換している何をしたか
string hx = "FF00";
。
ビットを反転して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
の値は、HXの32ビットの2の補数である "FFFF0100" です。 uint
はUInt32
とUInt16
タイプ別名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ビットの計算を使用する必要があります。このタイプの操作を明確にするために、明示的な名前を使用するほうがよいでしょう。
ありがとうCorey ..まさに私が探していたものでした。 – Liban
二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;
値が16進数の場合はどうなりますか? 'int'に変換する必要がありますか? – Liban
リテラルを16進数に変更してください。問題は表示されません。 –
@Liban文字列を表現に変換する際に問題がありますか? –
http://stackoverflow.com/questions/12942904/calculate-twos-complement-checksum-of-hexadecimal-string –