我正在写一个数字转换器。如何在C#中将整数转换为二进制字符串而不使用内置函数(Convert.ToString
根据给定的值做不同的事情?)
答案 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)
您可以从第一原则开始逐个数字地构建表示。
不确定您不想使用哪些内置函数,但可能您可以按字符构造字符串?
对于一个补码和两个补码,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');
}