c#中的十六进制数运算

时间:2012-09-20 10:35:16

标签: c# visual-studio-2010 binary hex

我在C#中创建一个应用程序,我有0x0FF8,0xFFFA等十六进制数字。

这里我只想从右到左12 bit。假设我的号码为0x0FF8。 所以我只想在FF8.(12 bits)上进行操作,这是签名号码。

十进制数是-8。在我的申请中,我必须先找出数字是否为负数?之后就是它的价值。

我没有得到如何在C#中有效地完成它,因为我必须非常快速地完成它。 数字表示为0x0FF8= -8,请参阅链接http://www.swarthmore.edu/NatSci/echeeve1/Ref/BinaryMath/NumSys.html

2 个答案:

答案 0 :(得分:3)

ERM,

只能获得正确的十二位,

var right12 = 0x0FFF & yourNumber;

要确定它是消极的还是积极的,

var positive = yourNumber >= 0;
var absoluteValue = Math.Abs(yourNumber); // Assuming yourNumber is Int32
var low12 = 0xFFF & absoluteValue;

对于要保留的十二位的位掩码执行bitwise and

答案 1 :(得分:1)

要检查有符号整数值是否为负,您必须检查其最左边的位。如果该位置位,则该值为负。

但是,您只有12位,而int有32位。因此,当您将12位放入int时,20位将重置为零(也就是未设置)。因此,最左边的位(#31)未设置,并且int值不被视为负值。

如果设置了第11位,你必须检查#11位并设置其他20位:

int Value = 0x0FF8;

// Check bit #11
if ((Value & 0x0800) != 0)
{
    // Set the 20 other bits to make the int value a negative one
    Value |= 0xFFFFF000;
}

您也可以使用short而不是int来做同样的事情。短路只有16位,所以:

short Value = 0x0FF8;

// Check bit #11
if ((Value & 0x0800) != 0)
{
    // Set the 4 other bits to make the short value a negative one
    Value |= 0xF000;
}

int版本可能是用于避免代码中强制转换的最佳版本。