最简单的方法来翻转布尔值?

我只是想根据它已经是翻转布尔值。 如果这是真的 – 使其为假。 如果这是错误的 – 使其成真。

这是我的代码摘录:

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

你可以像这样翻转一个值:

 myVal = !myVal; 

所以你的代码会缩短到:

 switch(wParam) { case VK_F11: flipVal = !flipVal; break; case VK_F12: otherVal = !otherVal; break; default: break; } 

显然你需要一个工厂模式!

 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> 

如果你知道值是0或1,你可以做flipval ^= 1

我发现最简单的解决scheme:

 x ^= true; 

仅供参考 – 如果您需要的字段不是整数,而是一个较大types的单个字节,请使用“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' */ int b_is_set = (flags & flab_b) != 0; 

这似乎是一个免费的…嘿。 这里是另一个虚拟variables,我猜是比“推荐”产品代码更“巧”的类别:

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

我想它的优点是:

  • 非常简洁
  • 不需要分支

而一个明显的缺点是

  • 非常简洁

这是接近@ korona的解决scheme使用?:但进一步采取了一个(小)的一步。

只是因为我最喜欢的奇怪的球方式来切换布尔没有列出…

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

也是如此。 🙂

(是的x = !x;更清晰易读)

codegolf'ish解决scheme将更像是:

 flipVal = (wParam == VK_F11) ? !flipVal : flipVal; otherVal = (wParam == VK_F12) ? !otherVal : otherVal; 

我更喜欢John T的解决scheme,但是如果你想要全部代码打高尔夫球,那么你的陈述逻辑上就会简化为:

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

显然你需要一个灵活的解决scheme,可以支持布尔types的伪装。 以下是允许的:

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

然后,您可以专门针对可能假装为布尔型的不同types。 例如:

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

使用这个构造的一个例子:

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

不,我不认真。

 flipVal ^= 1; 

同样如此

 otherVal 
Interesting Posts