2010-11-24 74 views
3

可能這非常簡單。將兩個布爾轉換爲int

如果我有兩個布爾值,a和b,我怎樣才能得到等效的「二進制」數字?

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

所以,你是想顯示`00,01,10,11`?或'0,1,2,3`? – 2010-11-24 22:48:41

+0

這個問題如何既是'java'也是'language-agnostic'? – 2010-11-25 00:54:57

+0

我已經創建了一個新版本的FizzBu​​zz與答案:)我需要得到一個基於'i%3 =和i%5 == 0'的索引http://rosettacode.org/wiki/FizzBu​​zz#Using_an_array – OscarRyz 2010-11-25 04:26:42

回答

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

不知道Java的處理,如C布爾值,但如果這樣做:

2*left+right; 
1

或者爲布爾數組的更通用的解決方案:

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

(看到它的工作on ideone

出於效率原因,如果數組大小爲< 32,那麼最好使用整數作爲內部處理,但這只是一個演示,所以我會跳過它。

0

這是比編碼更多的數論;它不是您的問題的確切解決方案,但它可能會讓您更深入地瞭解正在發生的事情。

在標準十進制表示法(基體10)的編號可以使用一系列總和來表示:

1023相當於1 * 1000 + 0 * 100 + 2×10 + 3 * 1

這相當於 (1 * 10^3)+(0 * 10^2)+(2 * 10^1)+(3 * 10^0)

在二元(基數2)的情況下,像101這樣的數字可以表示爲:

1 * 2^2 + 0 * 2^1 + 1 * 2^0 = 4 + 0 + 1 =小數點5.

3

由於您已將此標記爲與語言無關,因此我會發布如何在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 

另外,您可以使用由@大衛上述建議的伎倆:

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}