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

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

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

你能改进一下吗?

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


当前回答

v=!v;

对于v=0和v=1都成立;切换状态;

其他回答

如果只有两个值,如本例中的(0,1),我认为使用int是浪费的。宁愿用布尔值,用比特来计算。我知道我在假设,但在两种状态之间切换布尔似乎是理想的选择。

我不知道你为什么要建立你自己的布尔值?我喜欢时髦的语法,但为什么不编写易懂的代码呢?

这不是最短/最快的,但最清楚的(每个人都能读懂)是使用众所周知的if/else状态:

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

如果你想更清楚,你应该使用布尔值而不是数字。在大多数情况下,它们足够快。对于布尔值,你可以使用这样的语法,它将在简短中获胜:

v = !v;

一般来说,当你需要在两个值之间切换时,你可以从两个切换值的和中减去当前值:

0,1 -> v = 1 - v 1,2 -> v = 3 - v 4,5 -> v = 9 - v

解决方案列表

我想提出三个解决方案。它们都将任何值转换为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

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

比如v= 1 - v,或者v ^= 1或者v= +!v都能完成工作,但它们构成了我所说的黑客。这些不是漂亮的代码行,而是达到预期效果的廉价技巧。1 - v不传达“在0和1之间切换值”。这会降低代码的表现力,并引入一个地方(尽管很小),另一个开发人员将不得不解析您的代码。

相反,使用v = toggle(v)这样的函数可以快速传达意图。