【问题标题】:C# convert one's complement bits to a two's complement long?C#将一个补码位转换为一个二进制补码长?
【发布时间】:2013-04-04 14:04:03
【问题描述】:

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

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

【问题讨论】:

  • 我怀疑你的补码存储为string?
  • @Nolonar:我的理解是,如果将双精度数的整数表示视为一个补数,则按字典顺序排列。因此,我想将该补码表示转换为二进制补码值,以便我可以将其作为 C# long
  • 不幸的是,我不知道浮点数或双精度数是否存储在一个补码中,但我知道整数(和长整数)存储为二进制补码,因为它在正数和负数之间进行加法容易得多。在极端情况下,您始终可以通过查看最高有效位是否为1 来转换一个补码。如果是,则将其设置为0,反转所有位~,然后将结果加一。如果最重要的位是0,那么您已经有一个二进制补码(因为两者是等价的,当为正数时)
  • @Nolonar:您的评论似乎包含我想要的答案。介意重新发布它作为答案吗?

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


【解决方案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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 2020-03-05
    • 2014-09-16
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    相关资源
    最近更新 更多