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
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
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.
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.
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}
+1 für die Verwendung der dunkelsten Sprache, die ich heute lesen musste. –
Eigentlich sollte es sein: 'false + false = 0',' false + true = 1', 'true + false = 2' und' true + true = 3' – OscarRyz
@Oscar: Überprüfen Sie die Bearbeitung. – missingfaktor
Also, sind Sie wollen '00 angezeigt werden, 01, 10, 11 '? Oder '0, 1, 2, 3'? –
Wie kann diese Frage sowohl "Java" als auch "sprachunabhängig" sein? –
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