将0变为1,将1变为0的最优雅方式

84

如何以最优雅的方式完成以下操作:

int i = oneOrZero;

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

你可以假设 i 只能取值 1 或 0。


@GrayWizardx,@Carl:这是我的问题。我想要写整数,我做了这个。这只是一个代码片段,在删除与此具体问题无关的所有依赖项后。 - Roman
我认为这是一个很好的问题,而且负评只是令人悲伤的。我被迫在学校作业中使用“int”,所以这对我来说确实很重要。 - sshow
6个回答

190

4
这不仅更简洁,而且对我来说比减法答案更能表达出含义。 - G-Wiz

128

减法?

i = 1 - i;

不错。我考虑了二进制操作,没有考虑更简单的解决方案。 - Roman
等等...这是来自一位数学家的观点 ;) - Khaled Alshaya
2
真正的问题是,你会添加一个注释说“翻转i的值”还是什么都不做? - Dan Rosenstark
7
我个人认为在“翻转值”的意义下,异或更有意义,所以我可能会注释掉减法。但是,有些人看到位运算符时会感到难以理解,所以你可能需要无论如何都加上注释。 - Jimmy
1
不错。有时候我们竟然没想到像这样简单的事情。 - GabrielBB

8

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


1
我更喜欢这个,因为当我阅读代码时,我确切地知道它应该做什么。减法对此来说太聪明了,XOR 不是一种常见的操作,我不会立即认出它。 - Frank Schwieterman
根据我的经验,问号运算符也不是很常见。如果你从未见过问号运算符,它的作用并不明显。我会选择使用异或运算符(可能还要加上注释)。 - GreenMatt
嗯,好观点。从我的角度来看,在^之前我会先识别?,但我想这不是普遍的。 - Frank Schwieterman
1
@GreenMatt:我同意两者都不常见。与其基于个人偏好或普遍性的感知做决定,我会根据代码库中的其他部分来决定——也就是说,如果三元运算符在未来开发人员看到的代码中很常见,那就选择它;如果位运算很常见,就选择它。如果没有办法根据这些标准做出决定,就进行性能测试(我猜测异或运算的性能更好,但谁知道呢)。 @Chinmay:为什么不在oneOrZero上进行测试,并且只分配一次? - Carl
在声明中正确设置:int i = (oneOrZero==0)?1:0; - 我想这假定没有使用 i 的值的中间计算,这可能是不准确的。 - Carl
啊,我把楼主的代码读成了int i = 1int i = 0,而不是一个叫做oneOrZero的变量... - Chinmay Kanchi

6

i = ( i + 1 ) % 2,虽然我认为我们都同意减法或异或方法更好!(尽管它还有一个额外的好处,可以将开关翻转到不止二进制。)


5

使用位异或运算符:

i ^= 1;

1
int x = 0;
x=(int)Math.cos(x);
System.out.println("X value "+x);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接