在C#中,如何将64位补码(表示为long或ulong)转换为带符号的二进制补码?
作为参考,我正在尝试使用BitConverter.DoubleToInt64Bits()
实现基于ULP的双重比较。
答案 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;