C#如何使用位检查两个十进制值的相同符号?

C#如何使用位检查两个十进制值的相同符号?,c#,C#,我有两个小数值:a和b。如何使用位运算符检查两个值是否为同一符号?您的意思是两个值都为正还是都为负 bool bothSameSign = (d1 >= 0 && d2 >= 0) || (d1 < 0 && d2 < 0); bool bothSameSign=(d1>=0&&d2>=0)| |(d1=0))我想用位来比较,你可以有其他的解决方案吗?事实上,我提高了代码的性能,所以我查找解决同一符号(正和负)的最佳解决方案。我有一个问题

我有两个小数值:a和b。如何使用位运算符检查两个值是否为同一符号?

您的意思是两个值都为正还是都为负

bool bothSameSign = (d1 >= 0 && d2 >= 0) || (d1 < 0 && d2 < 0);
bool bothSameSign=(d1>=0&&d2>=0)| |(d1<0&&d2<0);

您可以使用
数学符号()。使用数学符号(x)
时,如果
x
为负,则返回
-1
,如果为正,则函数返回
1
,或者当其
0
返回
0
。因此:

if(Math.Sign(a) == Math.Sign(b))
{
    // Code when sign matched.
}
else
{
    // Code when sign not matched.
}
你可以

static int Sign(this decimal value)
{
    return Decimal.GetBits(value)[3] & 0x8000;
}

a.Sign == b.Sign;

我不认为您真的需要为此使用位运算符,但如果出于某种原因您必须使用位运算符(例如,这是一个学校问题):

首先,您可以使用get将两个
小数中的所有位作为4个整数的数组进行比较

然后,您可以检查int数组中偏移量3处int中第31位的符号位

Decimal d1 = 1;
Decimal d2 = -1;

var bits1 = Decimal.GetBits(d1);
var bits2 = Decimal.GetBits(d2);

const int signMask = 1 << 31;
const int signWord = 3;

bool sameSign = ((bits1[signWord] & signMask) == (bits2[signWord] & signMask));
十进制d1=1;
十进制d2=-1;
var bits1=十进制.GetBits(d1);
var bits2=十进制.GetBits(d2);

const int signMask=1要完成的符号检查需要按位移位:

if ( ( number >> sizeof(byte) * sizeof(numberType) -1 ) & 1)
{ /* < 0 */ }
else
{ /* >= 0 */ }

// you can of course use magic numbers 
// example for int: if ( ( number >> 31 ) & 1) { /* < 0 */ }

我无法验证它,但我怀疑它会破坏通过位运算符进行优化的目的。您也可以直接使用内置的
Math.Sign()

Decimal.GetBits()[31]==OtherDecimal.GetBits()[31]…@Sayse,在阅读链接的文档后,您会看到
GetBits
实际上返回4个整数,而不是32。@Jodrell-我还匆忙发布了msdn链接,我没有测试它,所以我把它作为一个注释:)我相信你的答案来自下面的vb示例:)@RajeevKumar:是的,我的意思是稍微短一点:
bool bothSameSign=((d1>=0)=(d2>=0))我想用位来比较,你可以有其他的解决方案吗?事实上,我提高了代码的性能,所以我查找解决同一符号(正和负)的最佳解决方案。我有一个问题,在符号方法后面,它是否使用位来检查?我不知道
Math.sign()
方法是否使用位来检查。它是一个.NET内置函数。您可以尝试反汇编函数以进行检查。检查dnSpy。这是一个很棒的反编译工具
var shiftableNumber = Int.Parse(Math.Truncate(yourDecimal));