Pregunta

I necesita convertir 10100101 binario a un número entero en C # sin utilizar Convert.ToInt64 (bin, 2), estoy trabajando con el marco micro .NET. Cuando uso int i = Convert.ToInt32(byt, 2); se produce una excepción con el mensaje en lugar de nada servicial:

 #### Exception System.ArgumentException - 0x00000000 (1) ####
    #### Message: 
    #### System.Convert::ToInt32 [IP: 000d] ####
    #### TRNG.Program::loop [IP: 0047] ####
    #### TRNG.Program::Main [IP: 0011] ####
A first chance exception of type 'System.ArgumentException' occurred in mscorlib.dll
An unhandled exception of type 'System.ArgumentException' occurred in mscorlib.dll
¿Fue útil?

Solución

Un poco más rápido que la opción de Femaref, ya que no requiere una llamada al método molestos, y los usos o en lugar de ADD sólo por diversión:

public static int ParseBinary(string input)
{
    // Count up instead of down - it doesn't matter which way you do it
    int output = 0;
    for (int i = 0; i < input.Length; i++)
    {
        if (input[i] == '1')
        {
            output |= 1 << (input.Length - i - 1);
        }
    }
    return output;
}

Es posible que desee:

  • Compruebe que la longitud es inferior a 32 para comenzar con
  • Compruebe que cada personaje es '0' o '1'

Sólo por LOLS, aquí está una versión de LINQ:

public static int ParseBinary(string input)
{
    return input.Select((c, index) => new { c, index })
        .Aggregate(0, (current, z) => current | (z.c - '0') << 
                                        (input.Length - z.index - 1));
}

O todavía más ordenado:

public static int ParseBinary(string input)
{
    return return input.Aggregate(0, (current, c) => (current << 1) | (c - '0'));
}

Otros consejos

string input = "10101001";
int output = 0;
for(int i = 7; i >= 0; i--)
{
  if(input[7-i] == '1')
    output += Math.Pow(2, i);
}

en general:

string input = "10101001";
int output = 0;
for(int i = (input.Length - 1); i >= 0; i--)
{
  if(input[input.Length - i] == '1')
    output += Math.Pow(2, i);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top