Java 将0更改为1以及将0更改为1的最优雅方式

Java 将0更改为1以及将0更改为1的最优雅方式,java,algorithm,Java,Algorithm,做下一件事最优雅的方式是什么: int i = oneOrZero; if (i == 0) { i = 1; } else { i = 0; } 您可以假设i只能有1或0个值。减法 i = 1 - i; i^=1 该值为1。这为您提供了两种方式(如果您需要翻转0 1任何一种方式): i=(i==0)?1:0是一种方法,尽管我更喜欢@Jimmy和@Yuval的版本。使用按位异或运算符: i ^= 1; i=(i+1)%2,尽管我认为我们都同意减法或异或法更好!(尽管它还有一个

做下一件事最优雅的方式是什么:

int i = oneOrZero;

if (i == 0) {
   i = 1;
} else {
   i = 0;
}
您可以假设
i
只能有1或0个值。

减法

i = 1 - i;
i^=1

该值为1。这为您提供了两种方式(如果您需要翻转
0 1
任何一种方式):


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

使用按位异或运算符:

i ^= 1;
i=(i+1)%2
,尽管我认为我们都同意减法或异或法更好!(尽管它还有一个额外的好处,那就是“翻转开关”的时间比二进制时间长。)

~1+2=0 ~0+2 = 1
您可以使用这种方法。

很好。我考虑过二进制操作,没有寻找更简单的解决方案。等等。。。来自数学家;)真正的问题是,你会添加一个评论说“翻转i的值”还是别管它?@yar:我个人觉得XOR在“翻转值”的意义上更有意义,所以我可能会评论减法。然而,有些人在看到按位运算符时会莫名其妙地感到焦虑,因此您可能不得不以任何一种方式进行评论。很好。疯狂有时我们无法思考像这样简单的事情这不仅更短,而且对我来说比减法答案的含义要好一点。我更喜欢这一个,因为当我阅读代码时,我知道它应该做什么。减法太聪明了,XOR在我马上就能识别的运算中并不常见。@Frank Schwieterman:以我的经验,XOR是什么?接线员也不是那么常见。如果你从来没看过电影?接线员,不清楚发生了什么。我会使用XOR(也许会对其进行评论)。嗯,这是一个很好的观点。从我的角度来看,我会认识到什么?在^之前,但我认为这不是普遍的。@GreenMatt:我同意两者都不常见。我会根据代码库的其余部分来决定,而不是个人偏好或对总体共性的看法——也就是说,如果三元运算符在未来开发人员看到的代码中的其他地方很常见,那么选择它;如果按位操作很常见,那么就这样做吧。若并没有办法根据那个标准来决定,那个么性能测试(我猜它更倾向于XOR,但谁知道呢)@Chinmay:为什么不在oneOrZero上测试,并且只赋值一次呢?在声明中要正确:int i=(oneOrZero==0)?1:0;-我想这假设没有使用i值的中间计算,i值可能不准确。这个one或zero业务是用来做什么的?我看到程序员断言我只有1或0,但这不是编译器强制执行的。为什么不使用布尔值或枚举值?让我澄清一下:为什么要使用int来表示(1)只有两个值(不是整数类型强制的)和(2)值发生翻转的对象?我同意@Carl的说法,这是一个人为的示例。从外部看,这段代码似乎没有任何用处。这只是你问题的一个样本吗?为什么不从一开始就把一或零颠倒过来呢?@GrayWizardx,@Carl:这是我的问题。我想写整数,我这样做。这只是删除了与这个具体问题无关的所有依赖项后的一段代码。我的目的不是冒犯,而是建议,也许有更多的上下文,人们可以使用不同的数据类型提供更好的解决方案。当然,如果你已经满意了,那么忽略我是正确的选择。
i ^= 1;
int x = 0;
x=(int)Math.cos(x);
System.out.println("X value "+x);