文字列の16進値があり、2の補数で表現する必要があります。
string hx = "FF00";
私がしたことは、それをバイナリに変換することです:
string h = Convert.ToString(Convert.ToInt32(hx, 16), 2 );
次にそれを反転しますが、NOT
演算子を使用できませんでした。
ビットを反転してから1(2の補数演算)を加算する簡単な方法はありますか?
文字列の16進値があり、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」になります。これは、hxの32ビット2の補数です。'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
ください。このタイプの操作を明確にするために、明示的な名前を使用することをお勧めします。
2つの褒め言葉は本当に簡単です:
int value = 100;
value = ~value // NOT
value = value + 1;
//Now value is -100
2つの補体系では、プラス1を反転して追加する必要があることに注意してください。
16進数:
int value = 0x45;
value = ~value // NOT
value = value + 1;