将整数转换为带前导零的二进制字符串

48

我需要将整数转换为二进制,并且要包括额外的位。

string aaa = Convert.ToString(3, 2);

它返回 11,但我需要 0011 或者 00000011

怎样做呢?

9个回答

89

11是代表数字3二进制表示法。这个值的二进制表示法是2位。

3 = 20 * 1 + 21 * 1

您可以使用String.PadLeft(Int, Char)方法添加这些零。

// convert number 3 to binary string. 
// And pad '0' to the left until string will be not less then 4 characters
Convert.ToString(3, 2).PadLeft(4, '0') // 0011
Convert.ToString(3, 2).PadLeft(8, '0') // 00000011

1
如果数字是变化的怎么办。例如,我正在读取一个文件,并将该文件中的十进制数转换为二进制(每个8位)。在这种情况下,从十进制到十进制的零的数量将不同。 - Abdelrahman Elshafiey

3
您可以使用以下方法:
public static class BinaryExt
{
    public static string ToBinary(this int number, int bitsLength = 32)
    {
        return NumberToBinary(number, bitsLength);
    }

    public static string NumberToBinary(int number, int bitsLength = 32)
    {
        string result = Convert.ToString(number, 2).PadLeft(bitsLength, '0');

        return result;
    }

    public static int FromBinaryToInt(this string binary)
    {   
        return BinaryToInt(binary);
    }

    public static int BinaryToInt(string binary)
    {   
        return Convert.ToInt32(binary, 2);
    }   
}

示例:

int number = 3; 
string byte3 = number.ToBinary(8); // output: 00000011

string bits32 = BinaryExt.NumberToBinary(3); // output: 00000000000000000000000000000011

3
我已创建一种方法来动态地写入前导零。
public static string ToBinary(int myValue)
{
      string binVal = Convert.ToString(myValue, 2);
      int bits = 0;
      int bitblock = 4;

      for (int i = 0; i < binVal.Length; i = i + bitblock)
      { bits += bitblock; }

      return binVal.PadLeft(bits, '0');
}

首先,我们将数值转换为二进制。 初始化位以设置二进制输出的长度。 一个Bitblock有4个数字。在for循环中,我们检查已转换的二进制值的长度,并添加“bits”以获得二进制输出的长度。

例如: 输入:1 -> 0001; 输入:127 -> 01111111 等等....


2
从.NET 8+开始,您可以通过使用方法ToString()来简单地完成它。
string s;
s = 42.ToString("b");        // .NET8+ => "101010".
s = Convert.ToString(42, 2); // .NET Framework 2+ to .NET7 => "101010".

s = 42.ToString("b16");                       // .NET8+ => "0000000000101010".
s = Convert.ToString(42, 2).PadLeft(16, '0'); // .NET Framework 2+ to .NET7 => "0000000000101010".

来源: Microsoft: .NET 8+标准格式说明符

1

这可能不是最优雅的解决方案,但从我的测试来看它是最快的:

string IntToBinary(int value, int totalDigits) {
    char[] output = new char[totalDigits];
    int diff = sizeof(int) * 8 - totalDigits;
    for (int n = 0; n != totalDigits; ++n) {
        output[n] = (char)('0' + (char)((((uint)value << (n + diff))) >> (sizeof(int) * 8 - 1)));
    }
    return new string(output);
}
string LongToBinary(int value, int totalDigits) {
    char[] output = new char[totalDigits];
    int diff = sizeof(long) * 8 - totalDigits;
    for (int n = 0; n != totalDigits; ++n) {
        output[n] = (char)('0' + (char)((((ulong)value << (n + diff))) >> (sizeof(long) * 8 - 1)));
    }
    return new string(output);
}

这个版本完全避免了if语句和分支,从而创建非常快速且最重要的是线性的代码。这比微软的Convert.ToString()函数快50%以上。

以下是一些基准测试代码

long testConv(Func<int, int, string> fun, int value, int digits, long avg) {
    long result = 0;
    for (long n = 0; n < avg; n++) {
        var sw = Stopwatch.StartNew();
        fun(value, digits);
        result += sw.ElapsedTicks;
    }
    Console.WriteLine((string)fun(value, digits));
    return result / (avg / 100);//for bigger output values
}
string IntToBinary(int value, int totalDigits) {
    char[] output = new char[totalDigits];
    int diff = sizeof(int) * 8 - totalDigits;
    for (int n = 0; n != totalDigits; ++n) {
        output[n] = (char)('0' + (char)((((uint)value << (n + diff))) >> (sizeof(int) * 8 - 1)));
    }
    return new string(output);
}
string Microsoft(int value, int totalDigits) {
    return Convert.ToString(value, toBase: 2).PadLeft(totalDigits, '0');
}

int v = 123, it = 10000000;
Console.WriteLine(testConv(Microsoft, v, 10, it));
Console.WriteLine(testConv(IntToBinary, v, 10, it));

这是我的结果。
0001111011
122
0001111011
75

微软的方法需要1.22个滴答,而我的只需要0.75个滴答。


1
public static String HexToBinString(this String value)
{
        String binaryString = Convert.ToString(Convert.ToInt32(value, 16), 2);
        Int32 zeroCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(binaryString.Length) / 8)) * 8;

        return binaryString.PadLeft(zeroCount, '0');
}

1

刚才Soner的回答如下:

Convert.ToString(3, 2).PadLeft(4, '0') 

只是想让您知道,int参数是您的字符串中字符的总数,char参数是将添加到字符串中填充缺少空间的字符。在您的示例中,您希望输出0011,这是4个字符并且需要0,因此您使用4作为int参数和'0'作为char。


0
string aaa = Convert.ToString(3, 2).PadLeft(10, '0');

2
因为没有解释,所以被标记为长度+内容问题。 - Oliver Matthews
1
这是第一个带答案的帖子。我认为,这个答案本身就很清楚易懂。 - SunsetQuest

0

使用此功能,您可以获取带有相应前导零的字符串的二进制表示。

string binaryString = Convert.ToString(3, 2);;
int myOffset = 4;
string modified = binaryString.PadLeft(binaryString.Length % myOffset == 0 ? binaryString.Length : binaryString.Length + (myOffset - binaryString.Length % myOffset), '0'));

在您的情况下,修改后的字符串将是0011,如果您想要,可以将偏移量更改为8,例如,您将得到00000011等等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接