【问题标题】:Most elegant way to change 0 to 1 and vice versa将 0 更改为 1 的最优雅方式,反之亦然
【发布时间】:2011-01-25 13:03:45
【问题描述】:

接下来要做的最优雅的方式是什么:

int i = oneOrZero;

if (i == 0) {
   i = 1;
} else {
   i = 0;
}

您可以假设i 只能有 1 或 0 值。

【问题讨论】:

  • oneOrZero 业务是用来做什么的?我看到你让程序员断言 i 只是 1 或 0,但这不是编译器强制执行的。为什么不使用布尔值或枚举?
  • 让我澄清一下:你为什么要使用 int 来表示 (1) 只有两个值的东西(不是由整数类型强制执行的)和 (2) 其值被翻转的东西?
  • 我同意@Carl 的观点,这是一个人为的样本。从外面看,这段代码似乎没有做任何有用的事情。这只是您问题的一个样本吗?为什么不把 oneOrZero 倒置一开始呢?
  • @GrayWizardx,@Carl:这是我的问题。我想写整数,我这样做。在删除与这个具体问题无关的所有依赖项之后,它只是一段代码。
  • 我的意图不是冒犯,而是建议也许有更多的上下文,人们可以使用不同的数据类型提供更好的解决方案。当然,如果你已经满意了,那么无视我是正确的做法。

标签: java algorithm


【解决方案1】:

使用按位XOR运算符:

i ^= 1;

【讨论】:

    【解决方案2】:
    int x = 0;
    x=(int)Math.cos(x);
    System.out.println("X value "+x);
    

    【讨论】:

      【解决方案3】:

      i ^= 1;

      XOR 的值为 1。这为您提供了两种方式(以防您需要翻转 0 <--> 1 任何一种方式):

      0 ^ 1 = 1
      1 ^ 1 = 0
      

      【讨论】:

      • 这不仅更短,而且对我来说比减法答案更有意义。
      【解决方案4】:

      i = (i == 0)?1:0 是一种方式,虽然我更喜欢@Jimmy 和@Yuval 的版本。

      【讨论】:

      • 我更喜欢这个,因为当我阅读代码时,我确切地知道它应该做什么。减法太聪明了,XOR 并不常见,我会立即识别它。
      • @Frank Schwieterman:根据我的经验,?运算符也不常见。如果你从未见过?操作员,这并不明显发生了什么。我会选择 XOR(也许会评论它)。
      • 嗯,好点。从我的角度来看,我会承认吗?在 ^ 之前,但我想那不是普遍的。
      • @GreenMatt:我同意两者都不常见。我不会基于任何个人偏好或对总体共性的看法,而是根据代码库的其余部分来决定——也就是说,如果三元运算符在未来开发人员看到的代码中的其他地方很常见,那就选择它;如果按位操作很常见,那就去吧。如果无法根据该标准做出决定,则进行性能测试(我猜这有利于 XOR,但谁知道)。 @Chinmay:为什么不在 oneOrZero 上测试,只分配一次?
      • 在声明中正确: int i = (oneOrZero==0)?1:0; - 我想这是假设没有使用 i 值的干预计算,这可能不准确。
      【解决方案5】:

      i = ( i + 1 ) % 2,尽管我认为我们都同意减法或异或法更好! (尽管它具有“翻转开关”的额外好处,而不是二进制。)

      【讨论】:

        【解决方案6】:

        减法?

        i = 1 - i;
        

        【讨论】:

        • 不错。我考虑了二进制操作,并没有寻找更简单的解决方案。
        • 等等……那来自一位数学家 ;)
        • 真正的问题是,您会添加一条评论说“翻转 i 的值”还是不理会它?
        • @yar:我个人认为 XOR 在“翻转值”意义上更有意义,所以我可能会评论一个减法。但是,有些人看到按位运算符时会莫名其妙地感到焦虑,因此您可能不得不对任何一种方式进行评论。
        • 不错。太疯狂了,有时我们无法思考这样简单的事情
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-22
        • 2010-11-03
        • 2020-12-29
        • 1970-01-01
        • 2012-04-11
        • 2013-09-21
        相关资源
        最近更新 更多