代码之家  ›  专栏  ›  技术社区  ›  OscarRyz

将两个布尔值转换为int值

  •  3
  • OscarRyz  · 技术社区  · 14 年前

    可能这非常容易。

    如果我有两个布尔值,A和B,我怎样才能得到等价的“二进制”数呢?

    false and false = 0 
    false and true  = 1 
    true  and false = 2 
    true  and true  = 3 
    
    4 回复  |  直到 14 年前
        1
  •  10
  •   3Dave    14 年前
    (left ? 2 : 0) + (right ? 1 : 0);
    

    不确定Java是否处理像C一样的布尔值,但如果它确实如此:

    2*left+right;
    
        2
  •  3
  •   OscarRyz    14 年前

    既然你已经将它标记为语言不可知论者,我将在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}
    
        3
  •  1
  •   Sean Patrick Floyd    14 年前

    或者一个更通用的布尔数组的解决方案:

    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,则最好使用int进行内部处理,但这只是一个演示,因此我将跳过它。

        4
  •  0
  •   mikurski    14 年前

    这比代码更符合数字理论;它不是解决问题的精确方法,但它可能会让您对正在发生的事情有更深入的了解。

    标准十进制记数法(以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=decimal 5。