如何将二进制转换为十进制

32

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

11个回答

96

9

5
如果您想使用手动方法而不是内置的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;
}

哪个更快?内置方法还是手动方式?你测试过吗? - Eric Snyder
Math.Pow(2, 0) 的结果是1,因此不需要 if 语句来减慢它的速度。 - Andrew Morton
2
非常正确,安德鲁。我想说,自从我添加了这个评论以来已经过了很长时间,我绝不会建议任何人使用这种方法。请使用C#库。我认为这更多是演示它的逻辑工作方式。 - euan jones
在我看来,if 语句不会使其变慢。它甚至可能加快速度。与 Math.Pow 相比,使用 int == int 的简单 if 语句要快得多。但是,Math.Pow(2, x) 通常会受到编译器的大量优化,因为其结果等于 1 << x。在这种情况下,将各个结果相加是一种浪费。更好的方法是将下一个 1 进行 二进制或 并向右移动。 - TiltonJH

2
string s=Console.ReadLine();

int b=Convert.ToInt32(s,2);

Console.WriteLine("Input value in base 10 = "+b);

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

4
你的回答使用了和 @SLaks 一样的解决方案,在这个话题上没有提供任何新内容。 - zajonc

1

使用二进制或和移位的手动方法将二进制字符串转换为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;
  }

0
我刚刚又用手动的方式创建了一个。
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;
    }

0
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;
        
    }

0

这应该可以工作

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

0

我想要一个解决方案,无论数字大小如何,始终给出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()添加缺失的零。 - Welcor
答案不适用于问题“二进制字符串->十进制/整数”,也不适用于“uint->字符串”。此外,不要连接字符串,请使用“new StringBuilder(32)”和“.Append('0')”等。而且,不要从“Number”中减去并进行比较,而是使用位掩码,例如:“(Number&0x80000000)== 0x80000000”表示最高位,下一个为“0x40000000”......。现在应该能够看出模式了,因此可以使用“for”,从0到i <32,同时将位掩码向右移动,如“bitMask >> 1”对于每个迭代附加正确的字符。 - TiltonJH
public static string ConvertUInt32ToBinaryString(uint value) { const uint highestBit = 1u << 31; var sb = new StringBuilder(32); uint bitMask = highestBit; for (int i = 0; i < 32; i++) { if ((value & bitMask) == bitMask) { sb.Append('1'); } else { sb.Append('0'); } bitMask >>= 1; } return sb.ToString(); } - TiltonJH

0

我在阅读了你的问题后尝试了这个方法。虽然有点冗长,但它提供了一个解决方案。我将二进制元素保存在数组中以获得解决方案。就像我说的那样,还可以找到更短的方法。
        // 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);

1
虽然提供仅包含代码的答案是可以接受的,但如果您能够提供代码的解释并帮助人们理解为什么它解决了问题,那对社区来说通常更有用。这可以减少后续问题的数量,并帮助新开发人员理解基本概念。您介意在问题中添加更多细节吗? - Jeremy Caney
1
好的,谢谢你的建议。我是StackOverflow的新手,我会慢慢适应的。 - Berkay Eşer

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