[英]C# how to check same sign of 2 decimal values using bit?
我有2個十進制值:a和b。 如何使用位運算符檢查兩個值是否相同?
您可以使用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.
}
你的意思是兩者都是積極的,還是兩者都是消極的?
bool bothSameSign = (d1 >= 0 && d2 >= 0) || (d1 < 0 && d2 < 0);
你可以做,
static int Sign(this decimal value)
{
return Decimal.GetBits(value)[3] & 0x8000;
}
並做
a.Sign == b.Sign;
我不認為你真的需要使用位運算符,但如果由於某種原因你必須 (例如這是一個學校問題):
首先,您可以使用Decimal.GetBits()
獲取兩個Decimals
中的所有位進行比較,作為4個整數的數組。
然后,您可以檢查整數數組中偏移量為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));
要完成的符號檢查需要按位移位:
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()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.