将两个布尔值转换为整数

4

这可能非常简单。

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

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

所以,您想要显示 00、01、10、11?还是 0、1、2、3 - Saladin Akara
这个问题怎么既可以是“Java”,又可以是“语言无关的”? - Stephen C
我已经创建了一个带有答案的新版本FizzBuzz :) 我需要根据i%3 =和i%5 == 0获取索引 http://rosettacode.org/wiki/FizzBuzz#Using_an_array - OscarRyz
4个回答

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

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

2*left+right;

好的。如果你真的想玩得开心,可以谷歌“达夫设备”。 - 3Dave

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}

今天读到的最晦涩难懂的语言,给你一个赞。 - 3Dave
实际上应该是:false + false = 0false + true = 1true + false = 2true + true = 3 - OscarRyz

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

(在 ideone 上查看它的运行链接)

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


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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接