C#转换为1';s将位补码为2';有多长?

C#转换为1';s将位补码为2';有多长?,c#,twos-complement,int64,bitconverter,ones-complement,C#,Twos Complement,Int64,Bitconverter,Ones Complement,在C#中,如何将64位的1补码(表示为long或ulong)转换为带符号的2补码long 作为参考,我正在尝试使用BitConverter.DoubleToInt64Bits()实现基于ULP的双重比较。为了将一个补码转换为二个补码,您需要先检查数字是正数还是负数。 由于2的补码的正表示形式与1的补码的正表示形式相同,因此仅当1的补码为负时,才需要执行转换 实际的转换是通过取一的补码的绝对值,翻转所有位,然后将结果增加一来完成的 if (myLong >> 63 != 0) // T

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


作为参考,我正在尝试使用
BitConverter.DoubleToInt64Bits()
实现基于ULP的双重比较。为了将一个补码转换为二个补码,您需要先检查数字是正数还是负数。
由于2的补码的正表示形式与1的补码的正表示形式相同,因此仅当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;

要将1的补码转换为2的补码,您需要先检查数字是正数还是负数。
由于2的补码的正表示形式与1的补码的正表示形式相同,因此仅当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;

我怀疑你的一的补码被存储为一个
字符串
?@Nolonar:我的理解是,如果将一个双精度的整数表示作为一个一的补码来处理,它是按词汇顺序排列的。因此,我想将1的补码表示转换为2的补码值,以便将其作为C#long进行处理不幸的是,我不知道浮点或双精度是否存储在1的补码中,但我知道整数(和long)存储为2的补码,因为它使正数和负数之间的加法更容易。在极端情况下,您可以通过查看最高有效位是否为
1
来转换1的补码。如果是,则将其设置为
0
,反转所有位
~
,然后将结果递增一。如果最重要的位是
0
,那么您已经有了一个2的补码(因为两者都是相等的,当为正时)@Nolonar:您的评论似乎包含了我想要的答案。介意把它作为一个答案吗?我怀疑你的一的补码被存储为一个
字符串
?@Nolonar:我的理解是,如果把一个双精度的整数表示作为一个一的补码,它是按词汇顺序排列的。因此,我想将1的补码表示转换为2的补码值,以便将其作为C#long进行处理不幸的是,我不知道浮点或双精度是否存储在1的补码中,但我知道整数(和long)存储为2的补码,因为它使正数和负数之间的加法更容易。在极端情况下,您可以通过查看最高有效位是否为
1
来转换1的补码。如果是,则将其设置为
0
,反转所有位
~
,然后将结果递增一。如果最重要的位是
0
,那么您已经有了一个2的补码(因为两者都是相等的,当为正时)@Nolonar:您的评论似乎包含了我想要的答案。介意把它作为答案转载吗?