如何在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');
您可以从第一原理逐位构建表示。
不确定你不想使用哪些内置函数,但可能你可以按字符构造一个字符串?
- 从最大功率2开始大于数字。
- 在字符串中按“1”。
- 从您的数字中减去2的幂。
- 取下两个最低功率。 如果你已达到一半,请停止。 你完成了。
- 如果剩下的数字大于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'); }