longの飽和演算を行うアルゴリズムを教えてください
long
のビット数で加減算の飽和演算を行いたいです。
検索してもSIMD関連の話題ばかり引っかかってしまいます。
int
幅であればlong
にキャストして演算後、int
に戻すという手段を使えますが、long
の場合BigInteger
を使用するというのは大げさな気がします。
効率のよいアルゴリズムがあれば教えて頂きたいです。
// SaturationLong
public struct SatLong
{
public long Value;
public SatLong(long value)
{
Value = value;
}
public static SatLong operator +(SatLong value1, SatLong value2)
{
// todo: saturation
return new SatLong(value1.Value + value2.Value);
}
public static SatLong operator -(SatLong value1, SatLong value2)
{
// todo: saturation
return new SatLong(value1.Value - value2.Value);
}
}