最简单的方法来翻转布尔值?
我只是想根据它已经是翻转布尔值。 如果这是真的 – 使其为假。 如果这是错误的 – 使其成真。
这是我的代码摘录:
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