7

我有 2 个十进制值:a 和 b。如何使用位运算符检查两个值是否相同符号?

4

5 回答 5

10

您可以使用Math.Sign(). 当您使用时Math.Sign(x),如果x为负,则返回-1,否则,如果为正,则函数返回10返回时0。所以 :

if(Math.Sign(a) == Math.Sign(b))
{
    // Code when sign matched.
}
else
{
    // Code when sign not matched.
}
于 2013-06-24T09:16:19.353 回答
3

你的意思是两个都是正面的还是两个都是负面的?

bool bothSameSign = (d1 >= 0 && d2 >= 0) || (d1 < 0 && d2 < 0);
于 2013-06-24T09:13:32.100 回答
1

你可以做,

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

a.Sign == b.Sign;
于 2013-06-24T09:24:33.860 回答
1

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

首先,您可以使用Decimal.GetBits()获取两者中的所有位Decimals进行比较,作为 4 个整数的数组。

然后,您可以检查 int 数组中偏移量 3 处的第 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));
于 2013-06-24T09:25:50.697 回答
0

您要完成的符号检查需要按位移位:

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 */ }

问题是,您不能对decimal. 你必须做这样的事情:

var shiftableNumber = Int.Parse(Math.Truncate(yourDecimal));

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

于 2013-06-24T11:44:56.220 回答