2010-11-24 10 views
3

Probablement c'est extrêmement facile.Convertit deux booléens en un int

Si j'ai deux booléens, a et b, comment puis-je obtenir le nombre "binaire" équivalent?

false and false = 0 
false and true = 1 
true and false = 2 
true and true = 3 
+0

Alors, vous êtes désireux d'afficher '00, 01, 10, 11'? Ou '0, 1, 2, 3'? –

+0

Comment cette question peut-elle être à la fois "java" et "language-agnostic"? –

+0

J'ai créé une nouvelle version de FizzBuzz avec la réponse :) J'avais besoin d'un index basé sur 'i% 3 = et i% 5 == 0' http://rosettacode.org/wiki/FizzBuzz#Using_an_array – OscarRyz

Répondre

10
(left ? 2 : 0) + (right ? 1 : 0); 

Je ne sais pas si poignées java booléens comme C, mais si elle le fait:

2*left+right; 
+0

Impressionnant! Merci! – OscarRyz

+4

Ce n'est pas le cas, donc ... le premier est correct. – OscarRyz

+0

Merci de m'avoir enseigné des opérateurs ternaires –

1

Ou une solution plus générale pour un tableau de booléens:

public static BigInteger asBinary(boolean[] values){ 
    BigInteger sum = BigInteger.ZERO; 
    for(int i = 0; i < values.length; i++){ 
     if(values[i]){ 
      sum = sum.add(
       BigInteger.valueOf(2).pow(values.length - (i+1))); 
     } 
    } 
    return sum; 
} 

(Voir le travail on ideone)

Pour des raisons d'efficacité, il serait probablement préférable d'utiliser ints pour le traitement interne si la taille du tableau est < 32, mais ce n'est qu'une démo, donc je vais passer cette étape.

0

Ceci est plus la théorie des nombres que le code; Ce n'est pas une solution exacte à votre problème, mais cela pourrait vous donner une meilleure idée de ce qui se passe.

Un certain nombre en notation standard décimal (base 10) peut être représentée en utilisant une série de sommes:

1023 est équivalente à 1 * 1000 + 0 * 100 + 2 * 10 + 3 * 1

Ceci est équivalent à (1 * 10^3) + (0 * 10^2) + (2 * 10^1) + (3 * 10^0)

Dans le cas de binaire (base 2), un nombre comme 101 peut être représenté comme suit:

1 * 2^2 + 0 * 2^1 + 1 * 2^0 = 4 + 0 + 1 = décimal 5.

3

Puisque vous avez marqué ceci comme langue-agnostique, je signalerais comment faire ceci dans Scala. :-)

scala> implicit def boolToAddable(a: Boolean) = new { 
    | def +(b: Boolean): Int = (a, b) match { 
    |  case (false, false) => 0 
    |  case (false, true) => 1 
    |  case (true, false) => 2 
    |  case (true, true) => 3 
    | } 
    | } 
boolToAddable: (a: Boolean)java.lang.Object{def +(b: Boolean): Int} 

scala> false + false 
res0: Int = 0 

scala> false + true 
res1: Int = 1 

scala> true + false 
res2: Int = 2 

scala> true + true 
res3: Int = 3 

Sinon, vous pouvez utiliser l'astuce suggérée par-dessus @ David:

scala> implicit def boolToAddable(a: Boolean) = new { 
    | def +(b: Boolean) = (if(a) 2 else 0) + (if(b) 1 else 0) 
    | } 
boolToAddable: (a: Boolean)java.lang.Object{def +(b: Boolean): Int} 
+0

+1 pour utiliser le langage le plus obscur que j'ai dû lire aujourd'hui. –

+0

En fait, il devrait être: 'false + false = 0',' false + true = 1', 'true + false = 2' et' true + true = 3' – OscarRyz

+0

@Oscar: Vérifiez l'édition. – missingfaktor