表示2的补码中的十六进制值

Lib*_*ban 5 c# bit-manipulation

我有一个字符串十六进制值,我需要用2的补码来表达它.

string hx = "FF00";
Run Code Online (Sandbox Code Playgroud)

我做的是,将其转换为二进制:

 string h = Convert.ToString(Convert.ToInt32(hx, 16), 2 );
Run Code Online (Sandbox Code Playgroud)

然后反转它,但我不能使用NOT运算符.

是否有任何简短的方法来反转位然后加1(2的补码运算)?

Cor*_*rey 7

答案可能取决于值的位宽对您是否重要。

简短的回答是:

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"
Run Code Online (Sandbox Code Playgroud)

的值为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"
Run Code Online (Sandbox Code Playgroud)

请记住,这uint是类型的别名UInt32ushort别名UInt16。为了清楚地说明这种类型的操作,您最好使用显式名称。


Dan*_*pez 5

两个补语真的很简单:

int value = 100;

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

//Now value is -100
Run Code Online (Sandbox Code Playgroud)

请记住,两个补码系统需要取反和加 1。

十六进制:

int value = 0x45;

value = ~value // NOT
value = value + 1;
Run Code Online (Sandbox Code Playgroud)