我只想基于它已经存在的内容来翻转布尔值。如果这是真的 - 把它弄错。如果它是假的 - 让它成真。
这是我的代码摘录:
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;
}
答案 0 :(得分:307)
你可以像这样翻转一个值:
myVal = !myVal;
因此您的代码会缩短为:
switch(wParam) {
case VK_F11:
flipVal = !flipVal;
break;
case VK_F12:
otherVal = !otherVal;
break;
default:
break;
}
答案 1 :(得分:72)
显然你需要一个工厂模式!
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>
答案 2 :(得分:32)
如果您知道值为0或1,则可以flipval ^= 1
。
答案 3 :(得分:26)
我找到的最简单的解决方案:
x ^= true;
答案 4 :(得分:10)
仅供参考 - 如果不是整数,而是必需字段是较大类型中的单个位,请使用'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;
答案 5 :(得分:9)
这似乎是一个免费的...嘿。这是另一个变体,我想这更像是“聪明”的类别,而不是我为生产代码推荐的东西:
flipVal ^= (wParam == VK_F11);
otherVal ^= (wParam == VK_F12);
我猜它的优点是:
一个明显的缺点是
这接近使用?的korona解决方案:但是进一步采取了一小步。
答案 6 :(得分:8)
仅仅因为我最喜欢的奇怪的球方式来切换布尔没有被列出......
bool x = true;
x = x == false;
也有效。 :)
(是x = !x;
更清晰,更容易阅读)
答案 7 :(得分:6)
codegolf'ish解决方案更像是:
flipVal = (wParam == VK_F11) ? !flipVal : flipVal;
otherVal = (wParam == VK_F12) ? !otherVal : otherVal;
答案 8 :(得分:2)
我更喜欢John T的解决方案,但是如果你想要所有的代码 - 高尔夫球,你的陈述在逻辑上会减少到这个:
//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;
答案 9 :(得分:1)
flipVal ^= 1;
同样适用于
otherVal
答案 10 :(得分:0)
显然,您需要一个灵活的解决方案,可以支持伪装成布尔值的类型。以下内容允许:
template<typename T> bool Flip(const T& t);
然后,您可以将此专门用于可能假装为布尔值的不同类型。例如:
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"); }
不,我不认真。
答案 11 :(得分:0)
对于值为0和1的整数,您可以尝试:
value = abs(value - 1);
C中的MWE:
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("Hello, World!\n");
int value = 0;
int i;
for (i=0; i<10; i++)
{
value = abs(value -1);
printf("%d\n", value);
}
return 0;
}
答案 12 :(得分:-1)
仅因为我喜欢提问代码。我建议您还可以通过执行以下操作来利用三元:
示例:
bool flipValue = false;
bool bShouldFlip = true;
flipValue = bShouldFlip ? !flipValue : flipValue;