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