【问题标题】:Convert an integer to a binary string with leading zeros将整数转换为带有前导零的二进制字符串
【发布时间】:2014-07-17 07:07:47
【问题描述】:

我需要将 int 转换为 bin 并使用额外的位。

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

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

它是怎么做的?

【问题讨论】:

    标签: c# binary


    【解决方案1】:

    11binary representation3。这个值的二进制表示是2 bits。

    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
    

    【讨论】:

    • 如果数字发生变化怎么办。例如,我正在读取一个文件并将该文件中的小数转换为二进制(每个 8 位)。在这种情况下,零的个数会从十进制到十进制不同。
    【解决方案2】:

    我创建了一种动态写入前导零的方法

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

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

    示例: 输入:1 -> 0001; 输入:127 -> 01111111 等等……

    【讨论】:

      【解决方案3】:
      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');
      }
      

      【讨论】:

        【解决方案4】:

        正是 Soner 回答的用途:

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

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

        【讨论】:

          【解决方案5】:

          你可以使用这些方法:

          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
          

          【讨论】:

            【解决方案6】:

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

            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 语句和因此创建非常快速且最重要的线性代码的分支。这比 microsoft 的 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 滴答

            【讨论】:

              【解决方案7】:
              string aaa = Convert.ToString(3, 2).PadLeft(10, '0');
              

              【讨论】:

              • 被标记为长度+内容 - 大概是因为没有解释。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-02-18
              • 1970-01-01
              • 2017-12-18
              • 2014-03-18
              • 2017-04-09
              • 1970-01-01
              相关资源
              最近更新 更多