我想在0和1之间切换一个变量。如果是0,我就设它为1,如果是1,我就设它为0。

这是一个非常基本的运算,我经常写,我想研究一下最短,最清晰的方法。这是我目前为止最好的:

v = (v == 0 ? 1 : 0);

你能改进一下吗?

编辑:这个问题问的是如何在保持清晰的情况下用最少的字符写出上面的语句——为什么这“不是一个真正的问题”?这并不是一个代码-高尔夫练习,尽管一些有趣的答案来自于把它当作高尔夫的人——很高兴看到高尔夫以一种建设性和发人深省的方式被使用。


当前回答

你可以简单地使用:

v = 1 - v;

当然,这是假设变量初始化正确,即它只有值0或1。

另一种方法更短,但使用了不太常见的操作符:

v ^= 1;

编辑:

清楚:清楚;我从来没有把这个问题作为代码高尔夫来处理,只是为了找到一种不使用任何模糊技巧(如操作符的副作用)的简单方法来完成任务。

其他回答

解决方案列表

我想提出三个解决方案。它们都将任何值转换为0(如果1,true等)或1(如果0,false, null等):

V = 1*!v V = +!v V = ~~!v

还有一个额外的,已经提到过,但聪明和快速(虽然只适用于0和1):

V = 1-v

解决方案1

您可以使用以下解决方案:

v = 1*!v

这将首先将整数转换为相反的布尔值(0为True,任何其他值为False),然后在乘以1时将其视为整数。结果0将被转换为1,任何其他值将被转换为0。

作为证明,请参阅这个jsfiddle并提供您希望测试的任何值:jsfiddle.net/rH3g5/

结果如下:

-123将转换为整数0, -10将转换为整数0, -1将转换为整数0, 0会转换成整数1, 1会转换成整数0, 2会转换成整数0, 60会转换成整数0,

解决方案2

正如mblase75指出,jAndy有一些其他的解决方案,作为我的工作:

v = +!v

它还首先将原始值转换为布尔值,但使用+而不是1*将其转换为整数。结果完全相同,但符号更短。

解决方案3

另一种方法是使用~~操作符:

v = ~~!v

它非常不常见,总是从布尔值转换为整数。

未经测试,但如果你是布尔,我认为var v = !v将工作。

参考:http://www.jackfranklin.co.uk/blog/2011/05/a-better-way-to-reverse-variables

如果v的可能值只有0和1,那么对于任意整数x,表达式为: v = Math.pow((Math。Pow (x, v) - x), v); 将切换该值。

我知道这是一个丑陋的解决方案,而且OP并没有想要这个…但我在厕所的时候想到了另一个解决方案:P

v = Number(!v)

它将反向布尔值类型转换为Number,这是期望的输出。

一个: v = + + v % 2

(在C语言中是简单的++v%=2)

ps.是的,我知道这是双赋值,但这只是C的方法的原始重写(它不工作,因为JS的前增量操作符不返回左值。