当前位置:  开发笔记 > 编程语言 > 正文

翻转布尔值的最简单方法是什么?

如何解决《翻转布尔值的最简单方法是什么?》经验,为你挑选了8个好方法。

我只是想根据它已经是什么来翻转一个布尔值.如果这是真的 - 把它弄错.如果它是假的 - 让它成真.

这是我的代码摘录:

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

John T.. 325

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

myVal = !myVal;

所以你的代码会缩短为:

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

    case VK_F12:
    otherVal = !otherVal;
    break;

    default:
    break;
}

默认值:break; 没必要. (10认同)

这不仅是最简单的,也是最干净的方式. (5认同)

我一直在代码中使用这个布尔"切换". (4认同)

如果你正在切换像object1-> system1.system2.system3.parameter1那样冗长的东西,那么拥有一个TOGGLE(a)宏会很有帮助.这可以防止出现一些错误,并使其在狭窄的屏幕上更具可读性. (3认同)


Drew.. 74

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

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


我们也可以为工厂添加单例模式. (7认同)

请注意切换到Java的微妙建议! (2认同)

大声笑......我们还需要一个切换布尔静态库 (2认同)


Mike Dunlave.. 33

如果您知道值为0或1,则可以这样做flipval ^= 1.



1> John T..:

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

myVal = !myVal;

所以你的代码会缩短为:

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

    case VK_F12:
    otherVal = !otherVal;
    break;

    default:
    break;
}


默认值:break; 没必要.
这不仅是最简单的,也是最干净的方式.
我一直在代码中使用这个布尔"切换".
如果你正在切换像object1-> system1.system2.system3.parameter1那样冗长的东西,那么拥有一个TOGGLE(a)宏会很有帮助.这可以防止出现一些错误,并使其在狭窄的屏幕上更具可读性.

2> Drew..:

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

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



我们也可以为工厂添加单例模式.
请注意切换到Java的微妙建议!
大声笑......我们还需要一个切换布尔静态库

3> Mike Dunlave..:

如果您知道值为0或1,则可以这样做flipval ^= 1.


@Alnitak:在某些情况下你是对的.我看到有些人把位打包在一起"节省空间",就像访问它们的指令没有占用任何空间一样.
@Mark:对不起.猜猜我是老式的.但是如果你的L值表达式真的很长,它确实有帮助,所以你不必重复它.另外,你可以说flipval ^ = TRUE.那个更好吗?
@Albert:`^`是_exclusive-or_运算符.`0 ^ 1`是'1`,'1 ^ 1`是'0`.如果忽略进位,则与添加相同.或者您可以将其视为 - 如果任一位为1,则结果是另一位的倒数.或者您可以将其视为提出问题:这两个位是否有所不同?

4> xamid..:

我找到的最简单的解决方案:

x ^= true;


请注意,例如`longVariableName ^ = true;`明显比`longVariableName =!longVariableName;`并且每个程序员都应该知道XOR.
`x =!x;`不仅更短,而且更清晰.

5> Alnitak..:

仅供参考 - 如果不是整数,则所需字段是较大类型中的单个位,请使用'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;



6> unwind..:

这似乎是一个免费的...嘿.这是另一个变体,我想这更像是"聪明"的类别而不是我为生产代码推荐的东西:

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

我猜它的优点是:

非常简洁

不需要分支

一个明显的缺点是

非常简洁

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


按操作顺序,我认为你可以省略括号,更简洁.:o

7> Rozwel..:

只是因为我最喜欢的奇怪的球方式切换bool没有列出...

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

也有效.:)

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



8> korona..:

codegolf'ish解决方案更像是:

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


好吧,如果我们要去codegolf:flipVal =(wParam == VK_F11)!= flipVal; ...
推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有