Конвертировать два логических значения в int - PullRequest
3 голосов
/ 25 ноября 2010

Наверное, это очень легко.

Если у меня два логических значения, a и b, как я могу получить эквивалентное «двоичное» число?

Ответы [ 4 ]

10 голосов
/ 25 ноября 2010
(left ? 2 : 0) + (right ? 1 : 0);

Не уверен, что Java обрабатывает логические значения, такие как C, но если это так:

3 голосов
/ 25 ноября 2010

Поскольку вы отметили это как независимое от языка, я опубликую это в 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}
1 голос
/ 25 ноября 2010

Или более общее решение для массива логических значений:

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 )

По соображениям эффективности, вероятно, этолучше всего использовать int для внутренней обработки, если размер массива <32, но это всего лишь демонстрация, поэтому я пропущу это. </p>

0 голосов
/ 25 ноября 2010

Это больше теория чисел, чем код;это не точное решение вашей проблемы, но оно может дать вам более полное представление о том, что происходит.

Число в стандартной десятичной записи (основание 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...