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

时间:2013-02-18 03:32:15

标签: c# bit-manipulation

我有一个字符串十六进制值,我需要用2的补码表示。

string hx = "FF00";

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

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

然后将其反转,但我无法使用NOT运算符。

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

2 个答案:

答案 0 :(得分:4)

两个补码非常简单:

int value = 100;

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

//Now value is -100

请记住,补充系统需要反转并添加加1。

以十六进制:

int value = 0x45;

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

答案 1 :(得分: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的值是“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"

请注意,uintUInt32的别名,ushortUInt16类别的别名。为了清楚这种类型的操作,您可能最好使用显式名称。

相关问题