2010-05-25 3 views
3

J'ai une méthode pour convertir un tableau de booléens en nombre entier. On dirait que cetteMéthode opposée de la puissance mathématique ajoutant des nombres

class Program 
    { 
     public static int GivMeInt(bool[] outputs) 
     { 
      int data = 0; 
      for (int i = 0; i < 8; i++) 
      { 
       data += ((outputs[i] == true) ? Convert.ToInt32(Math.Pow(2, i)) : 0); 
      } 
      return data; 

     } 

     static void Main(string[] args) 
     { 
      bool[] outputs = new bool[8]; 
      outputs[0] = false; 
      outputs[1] = true; 
      outputs[2] = false; 
      outputs[3] = true; 
      outputs[4] = false; 
      outputs[5] = false; 
      outputs[6] = false; 
      outputs[7] = false; 
      int data = GivMeInt(outputs); 
      Console.WriteLine(data); 
      Console.ReadKey(); 
     } 
    } 

Maintenant, je veux faire ensemble retour méthode inverse de valeurs booléennes Comme je suis court avec la connaissance de # .NET et C jusqu'à présent, je n'ai que mon hardcoding esprit de l'instruction switch ou si les conditions de chaque valeur int possible.

public static bool[] GiveMeBool(int data) 
     { 
      bool[] outputs = new bool[8]; 

      if (data == 0) 
      { 
       outputs[0] = false; 
       outputs[1] = false; 
       outputs[2] = false; 
       outputs[3] = false; 
       outputs[4] = false; 
       outputs[5] = false; 
       outputs[6] = false; 
       outputs[7] = false; 
      } 
      //After thousand lines of coed 
      if (data == 255) 
      { 
       outputs[0] = true; 
       outputs[1] = true; 
       outputs[2] = true; 
       outputs[3] = true; 
       outputs[4] = true; 
       outputs[5] = true; 
       outputs[6] = true; 
       outputs[7] = true; 
      } 
      return outputs; 
     } 

Je sais qu'il doit y avoir un moyen plus facile.

+1

Chaque fois que vous avez envie de « // Après mille lignes de Coed » vous devriez probablement venir sur StackOverflow =) –

+0

pinailler: C'est 2816 lignes de code. – SLaks

Répondre

8

Vous devez utiliser des opérateurs: au niveau du bit (testé)

public static bool[] GiveMeBool(int data) { 
    bool[] outputs = new bool[8]; 

    for(int i = 0; i < 8; i++) 
     outputs[i] = (data & (1 << i)) == (1 << i); 

    return outputs; 
} 

Vous pouvez également utiliser des opérateurs pour rendre votre bitwise d'origine beaucoup plus rapide: (non testé)

public static int GivMeInt(bool[] outputs) { 
    int data = 0; 
    for (int i = 0; i < 8; i++) 
     data += outputs[i] ? 1 << i : 0; 

    return data; 
} 
+0

+1, mais les 2 << i devraient être 1 << i? –

+0

@Chris: Oui, vous avez raison. – SLaks

1

Try this ..

public static bool[] GiveMeBool(int data) 
{ 
    bool[] outputs = new bool[8]; 

    for (int i = 0; i < 8; i++) 
     outputs[i] = (data & (int)Math.Pow(2, i)) != 0; 

    return outputs; 
} 
1

Que diriez-vous quelque chose comme ce qui suit?

Int32 x = 0xFF33; 
bool[] retval = new bool[32]; 
for (int i = 0; i < 32 && x != 0; i++, x = x >> 1) 
{ 
    retval[i] = (x & 1) == 1; 
} 

Il utilise le décalage de bits pour faire sa magie.

1

J'ai testé les méthodes en Java. La seule différence significative est le bool vs boolean mots-clés.

public class Test { 

    public static void main(String[] args) { 
     boolean[] bools = new boolean[]{true,true,false,false,false,false,false,false}; 
     int num = GivMeInt(bools); 
     boolean[] bools2 = GivMeBools(num); 
     for(int i = 0; i < 8; i++) System.out.println(bools[i]==bools2[i]); 
    } 

    public static int GivMeInt(boolean[] outputs) 
     { 
      int data = 0; 
      for (int i = 0; i < 8; i++) 
      { 
       if(outputs[i]) { 
        data += (1 << i); 

       } 
      } 
      return data; 
    } 

    public static boolean[] GivMeBools(int input) 
     { 
      boolean[] outputs = new boolean[8]; 
      for (int i = 0; i < 8; i++) 
      { 
       outputs[i] = (input & 0x1) == 1; 
       input = input >>> 1; 
      } 
      return outputs; 

     } 
} 
2

Ceci utilise le décalage de bits.

public static bool[] GiveMeBool(Int32 data) 
{ 
    bool[] bits = new bool[32]; 

    for (i = 0; i <= bits.Length - 1; i++) { 
     bits(i) = (data & 1) == 1; 
     data >>= 1; 
    } 

    return bits; 
} 
+0

+1 Merci Travaille aussi – adopilot

Questions connexes