2010-11-26 5 views
0

J'ai besoin de convertir le binaire 10100101 en nombre entier en C# sans utiliser Convert.ToInt64 (bin, 2), je travaille avec le .net micro framework. Lorsque j'utilise int i = Convert.ToInt32(byt, 2); une exception est levée avec le message plutôt unhelpfull de:Convertir binaire en int sans convertir.ToInt32

#### 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 
+0

Eh bien, ce qui est le typ e de 'byt'? – Jon

+1

Voulez-vous dire que vous devez convertir la chaîne "10100101"? –

+0

string byt = "10101001"; – UnkwnTech

Répondre

4

légèrement plus rapide que l'option de Femaref, car il ne nécessite pas une méthode satanés appeler, et utilise ou au lieu de ADD juste pour le plaisir:

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

Vous pouvez:

  • Vérifiez que la longueur est inférieure à 32 pour démarrer avec
  • Vérifiez que chaque caractère est '0' ou '1'

Juste pour LOLs, voici une version 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)); 
} 

Ou encore plus net:

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

Darn décalages, aurait dû voir celui qui vient (et j'ai juste eu des formats numériques binaires à l'université, aurait dû le savoir de toute façon). Belle solution – Femaref

+1

la longueur est inférieure ou égale à 8 pour un octet – leppie

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

en général:

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

Votre code (2ème bloc) tel quel, ne fonctionne pas, vous avez besoin de faire quelques conversions: changez l'entrée [input.Length - i] en input [input.Length - i] .ToString() et Math.Pow (2, i) à (int) System.Math.Pow (2, i) cependant, après cela, il se produit: Exception System.ArgumentOutOfRangeException - CLR_E_OUT_OF_RANGE sur la ligne int.Parse .... J'ai pu l'obtenir pour arrêter de jeter des exceptions mais ensuite il sort seulement 255 quand l'entrée n'était pas 11111111 – UnkwnTech

+0

Aussi pour le plaisir de performace vous pouvez laisser tomber int.Parse et changer cette ligne à 'if (input [input.Length - i] .ToString() == "1") ' – UnkwnTech

+1

@Unknwntech: Appeler ToString sur chaque caractère ne ressemble pas beaucoup à une optimisation pour moi - comparaisons de caractères FTW :) –