我有 2 个十进制值:a 和 b。如何使用位运算符检查两个值是否相同符号?
问问题
1775 次
5 回答
10
您可以使用Math.Sign()
. 当您使用时Math.Sign(x)
,如果x
为负,则返回-1
,否则,如果为正,则函数返回1
或0
返回时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 回答