【问题标题】:How to convert binary to decimal如何将二进制转换为十进制
【发布时间】:2022-01-14 20:40:51
【问题描述】:

如何将二进制字符串(例如1001101)转换为十进制? (77)

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    Convert.ToInt32 方法有一个overload that accepts a base parameter

    Convert.ToInt32("1001101", 2).ToString();
    

    【讨论】:

      【解决方案2】:

      看看这个非常相似但处理十六进制How to convert numbers between hexadecimal and decimal in C#?的问题

      Convert.ToInt64(value, 2)
      

      【讨论】:

        【解决方案3】:

        如果您采用手动方式而不是使用内置 C# 库,则可以这样做:

        static int BinaryToDec(string input)
        {
            char[] array = input.ToCharArray();
            // Reverse since 16-8-4-2-1 not 1-2-4-8-16. 
            Array.Reverse(array);
            /*
             * [0] = 1
             * [1] = 2
             * [2] = 4
             * etc
             */
            int sum = 0; 
        
            for(int i = 0; i < array.Length; i++)
            {
                if (array[i] == '1')
                {
                    // Method uses raising 2 to the power of the index. 
                    if (i == 0)
                    {
                        sum += 1;
                    }
                    else
                    {
                        sum += (int)Math.Pow(2, i);
                    }
                }
        
            }
        
            return sum;
        }
        

        【讨论】:

        • 哪个更快?内置方法还是手动方法?你测试过吗?
        • Math.Pow(2, 0) 为 1,因此不需要 if 会减慢速度。
        • 非常真实的安德鲁。我想说自从我添加此评论以来已经很长时间了,绝不会推荐任何人使用此方法。使用 C# 库。我认为这更多地展示了它在逻辑上是如何工作的。
        • 恕我直言if 不会减慢它的速度。它甚至可以加快速度。 Math.Pow 比简单的 ifint == int 慢得多。但是,Math.Pow(2, x) 通常会受到大量编译器优化,因为它的结果等于1 &lt;&lt; x。在这种情况下,将单个结果加在一起是一种浪费。最好是 binary or 下一个 1 并向右移动。
        【解决方案4】:
        string s=Console.ReadLine();
        
        int b=Convert.ToInt32(s,2);
        
        Console.WriteLine("Input value in base 10 = "+b);
        

        将任何二进制转换为十进制。 :)

        【讨论】:

        • 您的答案使用与@SLaks 相同的解决方案,并且在本主题中没有提供任何新内容。
        【解决方案5】:

        使用binary orshiftbinary string 转换为uint 的手动方法可能是:

          public static uint ConvertBinaryStringToUInt32(string binaryString)
          {
             if (binaryString is null)
             {
                throw new ArgumentNullException(nameof(binaryString));
             }
        
             if (binaryString.Length > 32)
             {
                throw new ArgumentOutOfRangeException(nameof(binaryString), binaryString.Length, "The specified binary string can not be longer than 32 characters.");
             }
        
             uint result = 0u;
        
             for (int i = 0; i < binaryString.Length; i++)
             {
                result <<= 1;
        
                char c = binaryString[i];
        
                if (c == '0')
                {
                }
                else if (c == '1')
                {
                   result |= 1u;
                }
                else
                {
                   throw new FormatException($"Character {i} of binary string \"{binaryString}\" is an invalid '{c}'. Can only be '0' or '1'.");
                }
             }
        
             return result;
          }
        

        【讨论】:

          【解决方案6】:

          我想要一个解决方案,无论数字大小,始终提供 32 位。所以这就是我创造的。

          public static string ConvertUintToBitString(uint Number)
          {
              string _BitString = string.Empty;
          
              if (Number >= 2147483648)
              {
                  _BitString += '1';
                  Number = Number - 2147483648;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 1073741824)
              {
                  _BitString += '1';
                  Number = Number - 1073741824;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 536870912)
              {
                  _BitString += '1';
                  Number = Number - 536870912;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 268435456)
              {
                  _BitString += '1';
                  Number = Number - 268435456;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 134217728)
              {
                  _BitString += '1';
                  Number = Number - 134217728;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 67108864)
              {
                  _BitString += '1';
                  Number = Number - 67108864;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 33554432)
              {
                  _BitString += '1';
                  Number = Number - 33554432;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 16777216)
              {
                  _BitString += '1';
                  Number = Number - 16777216;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 8388608)
              {
                  _BitString += '1';
                  Number = Number - 8388608;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 4194304)
              {
                  _BitString += '1';
                  Number = Number - 4194304;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 2097152)
              {
                  _BitString += '1';
                  Number = Number - 2097152;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 1048576)
              {
                  _BitString += '1';
                  Number = Number - 1048576;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 524288)
              {
                  _BitString += '1';
                  Number = Number - 524288;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 262144)
              {
                  _BitString += '1';
                  Number = Number - 262144;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 131072)
              {
                  _BitString += '1';
                  Number = Number - 131072;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 65536)
              {
                  _BitString += '1';
                  Number = Number - 65536;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 32768)
              {
                  _BitString += '1';
                  Number = Number - 32768;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 16384)
              {
                  _BitString += '1';
                  Number = Number - 16384;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 8192)
              {
                  _BitString += '1';
                  Number = Number - 8192;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 4096)
              {
                  _BitString += '1';
                  Number = Number - 4096;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 2048)
              {
                  _BitString += '1';
                  Number = Number - 2048;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 1024)
              {
                  _BitString += '1';
                  Number = Number - 1024;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 512)
              {
                  _BitString += '1';
                  Number = Number - 512;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 256)
              {
                  _BitString += '1';
                  Number = Number - 256;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 128)
              {
                  _BitString += '1';
                  Number = Number - 128;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 64)
              {
                  _BitString += '1';
                  Number = Number - 64;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 32)
              {
                  _BitString += '1';
                  Number = Number - 32;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 16)
              {
                  _BitString += '1';
                  Number = Number - 16;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 8)
              {
                  _BitString += '1';
                  Number = Number - 8;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 4)
              {
                  _BitString += '1';
                  Number = Number - 4;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number >= 2)
              {
                  _BitString += '1';
                  Number = Number - 2;
              }
              else
              {
                  _BitString += '0';
              }
              if (Number == 1)
              {
                  _BitString += '1';
              }
              else
              {
                  _BitString += '0';
              }
          
              return _BitString;
          }
          

          【讨论】:

          • 更好的方法是使用其他答案中提到的方法并使用 String.PadLeft() 添加缺少的零。
          • (提前添加了之前的评论)答案不适合问题'二进制字符串->十进制/整数'而不是'uint->字符串'。此外,不要联系字符串,而是使用“new StringBuilder(32)”,例如'.Append('0')'。而不是从“数字”中减去并比较它,而是使用一个位掩码,例如:“(数字和 0x80000000)== 0x80000000”代表最高位,接下来是“0x40000000”...。现在模式应该变得可见,所以使用从 0 到 i > 1”并附加正确的字符。
          • 结果:公共静态字符串 ConvertUInt32ToBinaryString(uint value) { const uinthighestBit = 1u >= 1; } 返回 sb.ToString(); }
          【解决方案7】:

          我在阅读您的问题后尝试了这个。它有点长,但它提供了一个解决方案。我将二进制元素保存在数组中以获得解决方案。就像我说的,它有点长,可以找到更短的方法。

                  // Binary ------> Decimal 
                  int len;
                  double deci = 0;
          
                  Console.Write("Length of binary number: ");
                  len = Convert.ToInt32(Console.ReadLine());
          
                  int[] bnry = new int[len];
          
                  for (int i = 0; i < len; i++)
                  {
                      Console.Write("{0} index of binary number: ", i);
                      bnry[i] = Convert.ToInt32(Console.ReadLine());
                  }
                  Console.Write("Your binary number: ");
                  for (int i = len - 1; 0 <= i; i--)
                  {
          
                      Console.Write(bnry[i]);
          
                  }
          
                  Console.Write("\nDecimal number: ");
                  for (int i = 0; i < len; i++)
                  {
                      deci += (bnry[i] * Math.Pow(2, i));
                  }
                  Console.Write(deci);
          

          【讨论】:

          • 虽然提供纯代码答案是可以接受的,但如果您还可以提供代码解释并帮助人们理解它为什么解决了问题。这可以减少后续问题的数量,并帮助新开发人员理解底层概念。您介意用更多细节更新您的问题吗?
          • 是的,当然。感谢您的建议,我是 StackOverflow 的新手,随着时间的推移,我会习惯的。
          【解决方案8】:

          我刚刚做了另一种手动方式

          private int binary2Decimal(string bin)
              {
                  int res;
                  char[] cArr = bin.ToCharArray();
                  Array.Reverse(cArr); // Reverse binary string
                  List<int> iArr = new List<int>();
                  for (int i = bin.Length - 1; i > -1; i--) // Get the bits
                      iArr.Add(Int16.Parse(cArr[i].ToString()) * (int)Math.Pow(2, i)); // Calculate each bits and add to an array
                  res = iArr.ToArray().Sum(); // Calculate all the numbers and add to the final result
                  return res;
              }
          

          【讨论】:

            【解决方案9】:
            public static int ToDecimal(int n) //1110
                {
                    int result = 0;
                    var number = n.ToString().ToCharArray();
                    var dic = new Dictionary<int, string>();
                    var len = number.Length - 1;
            
                    for (int i = 0; i < number.Length && len >= 0; i++)
                    {
                        dic.Add(i, number[len--].ToString());
                    }
            
                    foreach (var item in dic)
                    {
                        if(Convert.ToInt32(item.Value) > 0 )
                        {
                            result = result + Convert.ToInt32(Math.Pow(2, item.Key));
                        }
                    }
            
                    return result;
                    
                }
            

            【讨论】:

              【解决方案10】:

              这应该可行

                      static int binaryToDecimal(string input) {
                       int result = 0;
                       for (int i = input.Length; i > 0 ; i--)
                           if (input.Substring(i-1,1) == "1")
                               result += (int)Math.Pow(2,(input.Length-i));
                       return result;
                      }
              

              【讨论】:

                【解决方案11】:

                // 1. In the first method we will use parseInt() function to convert binary to decimal..
                        
                        let binaryDigit = 11011; let getDecimal = parseInt(binaryDigit, 2);
                        console.log(getDecimal);
                        

                   
                
                <!-- begin snippet: js hide: false console: true babel: false -->

                Check my github repo to find same kind of logicle puzzles

                【讨论】:

                • 这是一个关于C#的问题。
                • 是的,你可以把这个逻辑也用于 c#
                猜你喜欢
                • 2011-02-17
                • 1970-01-01
                • 2012-06-26
                • 1970-01-01
                • 2011-09-04
                • 2021-12-22
                • 2015-08-03
                相关资源
                最近更新 更多