我在C#中创建一个应用程序,我有0x0FF8,0xFFFA
等十六进制数字。
这里我只想从右到左12 bit
。假设我的号码为0x0FF8
。
所以我只想在FF8.(12 bits)
上进行操作,这是签名号码。
十进制数是-8
。在我的申请中,我必须先找出数字是否为负数?之后就是它的价值。
我没有得到如何在C#中有效地完成它,因为我必须非常快速地完成它。
数字表示为0x0FF8= -8
,请参阅链接http://www.swarthmore.edu/NatSci/echeeve1/Ref/BinaryMath/NumSys.html
答案 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版本可能是用于避免代码中强制转换的最佳版本。