1

我正在用 C# 制作一个应用程序,并且我有十六进制数字,例如0x0FF8,0xFFFA等。

在这里,我只想12 bit从右到左。假设我有一个数字0x0FF8。所以我只想对 进行操作FF8.(12 bits),这是有符号的数字。

它是十进制数-8。在我的应用程序中,我必须首先确定数字是否为负?在那之后它的价值。

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

4

2 回答 2

4

嗯,

要得到正确的 12 位,只有你能做到,

var right12 = 0x0FFF & yourNumber;

要找出它是消极的还是积极的,

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

这对您要保留的 12 位执行按位和针对位掩码。

于 2012-09-20T10:38:33.453 回答
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 版本可能是避免代码强制转换的最佳版本。

于 2012-09-21T00:50:15.267 回答