将两个布尔值转换为int

时间:2010-11-24 22:41:40

标签: java language-agnostic

这可能非常容易。

如果我有两个布尔值a和b,我怎样才能获得等效的“二进制”数字?

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

4 个答案:

答案 0 :(得分:10)

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

不确定java是否处理像C这样的布尔值,但是如果它处理:

2*left+right;

答案 1 :(得分: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

或者你可以使用上面@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}

答案 2 :(得分: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

出于效率原因,如果数组大小<1,则最好使用int进行内部处理。 32,但这只是一个演示,所以我会跳过它。

答案 3 :(得分: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.