2010-11-24 9 views
3

Wahrscheinlich ist das extrem einfach.Konvertiere zwei boolesche Werte in einen int

Wenn ich zwei booleans habe, a und b, wie bekomme ich die äquivalente "binäre" Zahl?

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

Also, sind Sie wollen '00 angezeigt werden, 01, 10, 11 '? Oder '0, 1, 2, 3'? –

+0

Wie kann diese Frage sowohl "Java" als auch "sprachunabhängig" sein? –

+0

Ich habe eine neue Version von FizzBuzz mit der Antwort erstellt :) Ich brauchte einen Index basierend auf 'i% 3 = und i% 5 == 0' http://rosettacode.org/wiki/FizzBuzz#Using_an_array – OscarRyz

Antwort

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

Nicht sicher, ob Java-Griffe booleans wie C, aber wenn es funktioniert:

2*left+right; 
+0

Genial! Vielen Dank! – OscarRyz

+4

Es geht nicht, also .. das erste stimmt. – OscarRyz

+0

Vielen Dank, dass Sie mich über ternäre Operatoren unterrichten. –

1

Oder eine allgemeine Lösung für eine Reihe von booleans:

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

(Sehen Sie es Arbeit on ideone)

Aus Effizienzgründen wäre es wahrscheinlich am besten, wenn die Array-Größe < 32 ist, Intars für die interne Verarbeitung zu verwenden, aber das ist nur eine Demo, also werde ich das überspringen.

0

Dies ist mehr Zahlentheorie als Code; Es ist keine exakte Lösung für Ihr Problem, aber es könnte Ihnen einen besseren Einblick geben, was vor sich geht.

Eine Zahl in Standard Dezimalnotation (Basis 10) kann unter Verwendung einer Reihe von Summen dargestellt werden:

1023 entspricht 1 * 1000 + 0 * 100 + 2 * 10 + 3 * 1

Dies entspricht (1 * 10^3) + (0 * 10^2) + (2 * 10^1) + (3 * 10^0)

Im Fall von binär (Basis 2), eine Zahl wie 101 kann wie folgt dargestellt werden:

1 * 2^2 + 0 * 2^1 + 1 * 2^0 = 4 + 0 + 1 = dezimal 5.

3

Da Sie dies als sprachunabhängig markiert haben, poste ich, wie dies in Scala zu tun ist. :-)

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 

Alternativ können Sie den Trick von @ David oben vorgeschlagen verwenden:

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 für die Verwendung der dunkelsten Sprache, die ich heute lesen musste. –

+0

Eigentlich sollte es sein: 'false + false = 0',' false + true = 1', 'true + false = 2' und' true + true = 3' – OscarRyz

+0

@Oscar: Überprüfen Sie die Bearbeitung. – missingfaktor