ブール値を反転する最も簡単な方法は?
-
03-07-2019 - |
質問
ブール値を、すでにあるものに基づいて反転させたいだけです。真の場合-偽にします。 falseの場合-trueにします。
コードの抜粋を次に示します。
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
を実行できます。
見つけた最も簡単な解決策:
x ^= true;
情報のみ-整数の代わりに必要なフィールドが大きな型内の単一ビットである場合、代わりに '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;
これはすべての人にとって自由なようです...ここに別のバリエーションがありますが、これは「賢い」カテゴリにあると思います。実稼働コードに推奨するものより:
flipVal ^= (wParam == VK_F11);
otherVal ^= (wParam == VK_F12);
次のような利点があると思います:
- 非常に簡潔
- 分岐は不要
同様に明らかな欠点は
- 非常に簡潔
これは?:を使用した@koronaのソリューションに近いですが、さらに1つ(小さな)ステップを踏みました。
ブールを切り替えるための私のお気に入りの奇妙なボールの方法がリストされていないため...
bool x = true;
x = x == false;
も機能します。 :)
(はい x =!x;
はより明確で読みやすいです)
codegolf'ishソリューションは次のようになります。
flipVal = (wParam == VK_F11) ? !flipVal : flipVal;
otherVal = (wParam == VK_F12) ? !otherVal : otherVal;
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;
flipVal ^= 1;
同じ
otherVal
明らかに、ブール型を装った型をサポートできる柔軟なソリューションが必要です。以下がそれを可能にします:
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"); }
いいえ、私は本気ではありません。
所属していません StackOverflow