C#将一个补码位转换为两个补码长?

时间:2013-04-04 14:04:03

标签: c# twos-complement int64 bitconverter ones-complement

在C#中,如何将64位补码(表示为long或ulong)转换为带符号的二进制补码?

作为参考,我正在尝试使用BitConverter.DoubleToInt64Bits()实现基于ULP的双重比较。

1 个答案:

答案 0 :(得分:3)

为了将一个补码转换为二进制补码,您需要先检查数字是正数还是负数。
由于二进制补码的正表示相当于一个补码的正表示,所以当你的补码为负时,你只需要执行转换。

实际转换是通过取一个补码的绝对值,翻转所有位,然后将结果递增1来完成的。

if (myLong >> 63 != 0) // The last bit is not 0, meaning myLong is negative
{
    myLong = (myLong & (long.MaxValue >> 1)); // sets the leading bit to 0, making myLong positive
    myLong = ~myLong + 1; // flips all bits and increments by 1
}
return myLong;


// One-liner alternative
return myLong >> 63 != 0 ? (~(myLong & (long.MaxValue >> 1))) + 1 : myLong;