Самый простой способ перевернуть логическое значение? - PullRequest
106 голосов
/ 04 марта 2009

Я просто хочу перевернуть логическое значение, основываясь на том, что оно уже есть. Если это правда - сделайте это ложным. Если это ложь - сделайте это правдой.

Вот мой фрагмент кода:

switch(wParam) {

case VK_F11:
  if (flipVal == true) {
     flipVal = false;
  } else {
    flipVal = true;
  }
break;

case VK_F12:
  if (otherVal == true) {
     otherValVal = false;
  } else {
    otherVal = true;
  }
break;

default:
break;
}

Ответы [ 11 ]

308 голосов
/ 04 марта 2009

Вы можете перевернуть значение следующим образом:

myVal = !myVal;

чтобы ваш код сократился до:

switch(wParam) {
    case VK_F11:
    flipVal = !flipVal;
    break;

    case VK_F12:
    otherVal = !otherVal;
    break;

    default:
    break;
}
72 голосов
/ 04 марта 2009

Очевидно, вам нужен заводской шаблон!

KeyFactory keyFactory = new KeyFactory();
KeyObj keyObj = keyFactory.getKeyObj(wParam);
keyObj.doStuff();


class VK_F11 extends KeyObj {
   boolean val;
   public void doStuff() {
      val = !val;
   }
}

class VK_F12 extends KeyObj {
   boolean val;
   public void doStuff() {
      val = !val;
   }
}

class KeyFactory {
   public KeyObj getKeyObj(int param) {
      switch(param) {
         case VK_F11:
            return new VK_F11();
         case VK_F12:
            return new VK_F12();
      }
      throw new KeyNotFoundException("Key " + param + " was not found!");
   }
}

: D

</sarcasm>
32 голосов
/ 04 марта 2009

Если вы знаете, что значения 0 или 1, вы можете сделать flipval ^= 1.

26 голосов
/ 21 марта 2014

Самое простое решение, которое я нашел:

x ^= true;
10 голосов
/ 04 марта 2009

Только для информации - если вместо целого числа ваше обязательное поле представляет собой один бит внутри большего типа, используйте вместо этого оператор 'xor':

int flags;

int flag_a = 0x01;
int flag_b = 0x02;
int flag_c = 0x04;

/* I want to flip 'flag_b' without touching 'flag_a' or 'flag_c' */
flags ^= flag_b;

/* I want to set 'flag_b' */
flags |= flag_b;

/* I want to clear (or 'reset') 'flag_b' */
flags &= ~flag_b;

/* I want to test 'flag_b' */
bool b_is_set = (flags & flag_b) != 0;
9 голосов
/ 05 марта 2009

Кажется, это все для всех ... Хех. Вот еще одно изречение, которое, я думаю, больше относится к категории «умных», чем то, что я бы порекомендовал для производственного кода:

flipVal ^= (wParam == VK_F11);
otherVal ^= (wParam == VK_F12);

Я полагаю, что это следующие преимущества:

  • Очень кратко
  • Не требует разветвления

И такой же очевидный недостаток -

  • Очень кратко

Это близко к решению @ korona, использующему?: Но сделало еще один (маленький) шаг.

8 голосов
/ 08 марта 2012

Только потому, что мой любимый нечетный способ переключения bool не указан ...

bool x = true;
x = x == false;

тоже работает. :)

(да, x = !x; яснее и легче для чтения)

6 голосов
/ 04 марта 2009

Решение Codegolf'ish будет больше похоже на:

flipVal = (wParam == VK_F11) ? !flipVal : flipVal;
otherVal = (wParam == VK_F12) ? !otherVal : otherVal;
2 голосов
/ 04 марта 2009

Я предпочитаю решение Джона Т, но если вы хотите заняться всем код-гольфом, ваше утверждение логически сводится к следующему:

//if key is down, toggle the boolean, else leave it alone.
flipVal = ((wParam==VK_F11) && !flipVal) || (!(wParam==VK_F11) && flipVal);
if(wParam==VK_F11) Break;

//if key is down, toggle the boolean, else leave it alone.
otherVal = ((wParam==VK_F12) && !otherVal) || (!(wParam==VK_F12) && otherVal);
if(wParam==VK_F12) Break;
1 голос
/ 31 августа 2013
flipVal ^= 1;

то же самое относится к

otherVal
...