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

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

  • 二进制 – >符号幅度
  • 二进制 – >一个补充
  • 二进制>二进制补码

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

 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); 

简单的说法:

 IntToBinValue = Convert.ToString(6, 2); 

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

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

您可能会发现decimal.GetBits()文档很有用。

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

更新:根据作者的更新:

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

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

您可以从第一原理逐位构建表示。

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

  1. 从最大功率2开始大于数字。
  2. 在字符串中按“1”。
  3. 从您的数字中减去2的幂。
  4. 取下两个最低功率。 如果你已达到一半,请停止。 你完成了。
  5. 如果剩下的数字大于2的幂,请返回步骤2.如果不是,请在字符串中按“0”并返回步骤4。

对于一个补码和两个补码, 计算这些补充步骤 。

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

这是一个不安全的实现:

  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; } 

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

 // 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'); }