【问题标题】:expressing hex value in 2's complement用 2 的补码表示十六进制值
【发布时间】:2013-02-02 10:57:55
【问题描述】:

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

string hx = "FF00";

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

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

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

有没有什么捷径可以反转位然后加 1(2 的补码运算)?

【问题讨论】:

标签: c# bit-manipulation


【解决方案1】:

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

简短的回答是:

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 类型的别名。为清楚起见,您最好使用显式名称。

【讨论】:

  • 谢谢 Corey.. 这正是我想要的。
【解决方案2】:

二补真的很简单:

int value = 100;

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

//Now value is -100

请记住,二补系统需要反转和加 1。

十六进制:

int value = 0x45;

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

【讨论】:

  • 如果值是十六进制怎么办?我需要转换成int吗?
  • 把文字改成十六进制,没看到问题。
  • @Liban 将字符串转换为其表示形式有问题吗?
猜你喜欢
  • 2014-11-03
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 2014-04-16
  • 2015-10-26
  • 2016-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多