Najprostszy sposób na odwrócenie wartości logicznej?

Chcę tylko odwrócić logikę opartą na tym, co już jest. Jeśli to prawda-zrób to fałszywie. Jeśli to fałsz-zrób to prawdą.

Oto mój fragment kodu:

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;
}
Author: John T, 2009-03-04

11 answers

Możesz przerzucić taką wartość:

myVal = !myVal;

Więc Twój kod skróci się do:

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

    case VK_F12:
    otherVal = !otherVal;
    break;

    default:
    break;
}
 298
Author: John T,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-04 16:54:16

Najwyraźniej potrzebujesz fabrycznego wzoru!

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>
 67
Author: Drew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-04 16:56:11

Jeśli wiesz, że wartości są 0 LUB 1, możesz zrobić flipval ^= 1.

 31
Author: Mike Dunlavey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-04 16:55:44

Najprostsze rozwiązanie jakie znalazłem:

x ^= true;
 20
Author: xamid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-21 16:46:39

Tylko dla informacji-jeśli zamiast liczby całkowitej Wymagane pole jest pojedynczym bitem w większym typie, użyj operatora '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;
 10
Author: Alnitak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-17 11:41:21

To wydaje się być free-for-all ... Heh. Oto kolejna odmiana, która chyba jest bardziej w kategorii "sprytna" niż coś, co polecam do kodu produkcji:

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

Myślę, że jego zalety to:

  • bardzo zwięzłe
  • nie wymaga rozgałęziania

I równie oczywistą wadą jest

  • bardzo zwięzłe

To jest zbliżone do rozwiązania @ korona za pomocą ?: ale zrobił jeden (mały) krok dalej.

 9
Author: unwind,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-05 07:56:17

Tylko dlatego, że mój ulubiony dziwny sposób na przełączenie boola nie jest wymieniony...

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

Też działa. :)

(Tak x = !x; jest jaśniejszy i łatwiejszy do odczytania)

 6
Author: Rozwel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-07 20:34:36

Rozwiązanie codegolf ' ish byłoby bardziej jak:

flipVal = (wParam == VK_F11) ? !flipVal : flipVal;
otherVal = (wParam == VK_F12) ? !otherVal : otherVal;
 5
Author: korona,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-04 16:00:15

Preferuję rozwiązanie Johna T, ale jeśli chcesz iść na całego code-golfy, twoja wypowiedź logicznie redukuje się do tego:

//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;
 2
Author: JosephStyons,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-04 16:46:32
flipVal ^= 1;

To samo dotyczy

otherVal
 1
Author: evandrix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-31 17:36:05

Oczywiście potrzebujesz elastycznego rozwiązania, które może obsługiwać typy maskujące się jako logiczne. Pozwala na to:

template<typename T>    bool Flip(const T& t);

Możesz następnie specjalizować to dla różnych typów, które mogą udawać, że są logiczne. Na przykład:

template<>  bool Flip<bool>(const bool& b)  { return !b; }
template<>  bool Flip<int>(const int& i)    { return !(i == 0); }

Przykład użycia tej konstrukcji:

if(Flip(false))  { printf("flipped false\n"); }
if(!Flip(true))  { printf("flipped true\n"); }

if(Flip(0))  { printf("flipped 0\n"); }
if(!Flip(1)) { printf("flipped 1\n"); }
Nie, Nie mówię poważnie.
 0
Author: dma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-04 17:14:50