簡體   English   中英

C#如何使用位檢查2個十進制值的相同符號?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM