如何在C#中将整数转换为二进制字符串?

时间:2010-09-13 16:08:37

标签: c#

我正在写一个数字转换器。如何在C#中将整数转换为二进制字符串而不使用内置函数(Convert.ToString根据给定的值做不同的事情?)

  • 二进制 - >标志大小
  • 二进制 - >一个补充
  • 二进制>两个补码

8 个答案:

答案 0 :(得分:17)

今天几乎所有的计算机都在内部使用二进制补码表示,所以如果你做这样的直接转换,你将得到两个补码字符串:

public string Convert(int x) {
  char[] bits = new char[32];
  int i = 0;

  while (x != 0) {
    bits[i++] = (x & 1) == 1 ? '1' : '0';
    x >>= 1;
  }

  Array.Reverse(bits, 0, i);
  return new string(bits);
}

这是剩余两次转换的基础。对于符号幅度,只需事先提取符号并转换绝对值:

byte sign;
if (x < 0) {
  sign = '1';
  x = -x;
} else {
  sign = '0';
}
string magnitude = Convert(x);

对于一个补码,如果数字为负数,则减一:

if (x < 0)
  x--;
string onec = Convert(x);

答案 1 :(得分:13)

简单的说法:

IntToBinValue = Convert.ToString(6, 2);

答案 2 :(得分:6)

至少部分答案是使用decimal.GetBits(someValue)将小数转换为二进制表示。

反过来,

BitConverter.GetBytes可用于从decimal.GetBits()返回的元素,以将整数转换为字节。

您可能会发现decimal.GetBits() documentation有用。

我不知道如何从字节到十进制。

更新:基于作者的更新:

BitConverter包含将数字转换为字节的方法,这样便于获取二进制表示。 GetBytes()ToInt32()方法可以方便地进行每个方向的转换。如果您发现更容易解释为1和0,则ToString()重载便于创建十六进制字符串表示。

答案 3 :(得分:4)

   var a = Convert.ToString(4, 2).PadLeft(8, '0');

答案 4 :(得分:1)

这是我的: (上半部分将32位二进制字符串转换为32位整数,下半部分将32位整数转换回32位二进制字符串)。 希望这会有所帮助。

using

答案 5 :(得分:0)

这是一个不安全的实现:

    private static unsafe byte[] GetDecimalBytes(decimal d)
    {
        byte* dp = (byte*) &d;
        byte[] result = new byte[sizeof(decimal)];
        for (int i = 0; i < sizeof(decimal); i++, dp++)
        {
            result[i] = *dp;
        }
        return result;
    }

现在又回来了:

    private static unsafe decimal GetDecimal(Byte[] bytes)
    {
        if (bytes == null)
            throw new ArgumentNullException("bytes");

        if (bytes.Length != sizeof(decimal))
            throw new ArgumentOutOfRangeException("bytes", "length must be 16");

        decimal d = 0;
        byte* dp = (byte*)&d;
        byte[] result = new byte[sizeof(decimal)];
        for (int i = 0; i < sizeof(decimal); i++, dp++)
        {
            *dp = bytes[i];
        }
        return d;
    }

答案 6 :(得分:0)

您可以从第一原则开始逐个数字地构建表示。

不确定您不想使用哪些内置函数,但可能您可以按字符构造字符串?

  1. 以最大数量2开始,大于数字。
  2. 将“1”推入字符串。
  3. 从你的号码中减去两个人的力量。
  4. 取下两个最低功率。如果你已达到一半,请停止。你已经完成了。
  5. 如果剩下的数字大于2的幂,请返回步骤2.如果不是,请在字符串中按“0”并返回步骤4.
  6. 对于一个补码和两个补码,calculate those with an additional step

    或者这种方式对于你需要的东西来说太基础了吗?

答案 7 :(得分:0)

这是一个优雅的解决方案:

// Convert Integer to binary and return as string
private static string GetBinaryString(Int32 n)
{
    char[] b = new char[sizeof(Int32) * 8];

    for (int i = 0; i < b.Length; i++)
        b[b.Length-1 - i] = ((n & (1 << i)) != 0) ? '1' : '0';

    return new string(b).TrimStart('0');
}