是否有更好的书写方式v =(v == 0?1:0); [关闭]

我想在0和1之间切换变量。如果它是0,我想将其设置为1,否则,如果它是1,我想将其设置为0。

这是一个非常基本的操作,我经常写这本书,希望研究出最短,最清晰的方法。到目前为止,这是我最好的:

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

您可以对此进行改进吗?

编辑:问题是询问如何用最少的字符写以上语句,同时保持清晰度-这是“不是一个真正的问题”吗?这样做并非旨在进行代码高尔夫练习,尽管人们从高尔夫运动中获得了一些有趣的答案-很高兴看到高尔夫以建设性和发人深省的方式使用。

Stafan番长2020/03/13 15:26:33

好吧,众所周知,在javascript中,布尔比较也将为您提供预期的结果。

v = v == 0足够了。

以下是该代码:

var v = 0;
alert("if v  is 0 output: " + (v == 0));

setTimeout(function() {
  v = 1;
  alert("if v  is 1 Output: " + (v == 0));
}, 1000);

JSFiddle:https ://jsfiddle.net/vikash2402/83zf2zz0/

希望这对您有帮助:)

小小Eva2020/03/13 15:26:33

v =数字(!v)

它将把转换后的布尔值类型转换为Number,这是所需的输出。

梅小宇宙2020/03/13 15:26:33
v=!v;

将适用于v = 0和v = 1;并切换状态;

樱Itachi2020/03/13 15:26:33

如果只有两个值,例如在这种情况下(0,1),我相信使用int是浪费的。而是去布尔值并逐位工作。我知道我在假设,但是在两个状态之间切换的情况下,布尔值似乎是理想的选择。

AEva2020/03/13 15:26:33

未经测试,但是如果您想使用布尔值,我认为var v = !v可以。

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

古一蛋蛋2020/03/13 15:26:32

v等于任何值的另一种创造性的实现方式将始终返回01

v = !!v^1;
村村A小卤蛋2020/03/13 15:26:32

定义一个数组{1,0},将v设置为v [v],因此v的值为0变为1,反之亦然。

马克2020/03/13 15:26:32

如果确定输入为1或0,则可以使用:

v = 2+~v;
猿GO2020/03/13 15:26:32

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

我知道这是一个丑陋的解决方案,OP并没有在寻找这个...但是当我在厕所时,我只是在考虑另一种解决方案:P

小哥西门2020/03/13 15:26:32

多一个: v=++v%2

(在C语言中,这很简单++v%=2

ps。是的,我知道这是双重赋值,但这只是C方法的原始重写(按原样工作,因为JS预增量运算符未返回左值)。

GreenSamA2020/03/13 15:26:32

由于这是JavaScript,因此我们可以使用一元+转换为int:

v = +!v;

这将使(给出if if NOT的值符合逻辑然后,我们将返回的布尔值转换为其相应的整数表示形式。vtruev == 0falsev == 1

西里小哥2020/03/13 15:26:32

仅用于踢球:v = Math.pow(v-1,v)也在1和0之间切换。

神奇Near2020/03/13 15:26:32

我不知道您为什么要建立自己的布尔值?我喜欢时髦的语法,但是为什么不编写可理解的代码呢?

这不是最短/最快的,但最清晰(所有人都可读)的是使用众所周知的if / else状态:

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

如果您想弄清楚,应该为此使用布尔值而不是数字。在大多数情况下,它们足够快。使用布尔值时,您可以只使用以下语法,这将在短时间内获胜:

v = !v;
Pro乐2020/03/13 15:26:32

原始解决方案的另一种形式:

v = Number(v == 0);

编辑:感谢TehShrike和Guffa指出我原始解决方案中的错误。

路易Itachi小小2020/03/13 15:26:32

另一种方法是:

v = ~(v|-v) >>> 31;
凯Sam2020/03/13 15:26:32

我将使其更加明确。

什么v意思

例如,当v是某个状态时。创建一个对象状态。在DDD中,是一个值对象。

在此值对象中实现逻辑。然后,您可以以更具可读性的更实用的方式编写代码。可以通过基于当前状态创建新的状态来完成切换状态。然后,将if语句/逻辑封装在对象中,可以对其进行单元测试。valueObject始终是不可变的,因此没有身份。因此,要更改其价值,就必须创建一个新的价值。

例:

public class Status
{
    private readonly int _actualValue;
    public Status(int value)
    {
        _actualValue = value;
    }
    public Status(Status status)
    {
        _actualValue = status._actualValue == 0 ? 1 : 0; 
    }

    //some equals method to compare two Status objects
}

var status = new Status(0);

Status = new Status(status);
村村老丝2020/03/13 15:26:32

为了总结另一个答案,评论和我自己的观点,我建议结合以下两点:

  1. 使用功能进行切换
  2. 在此函数内使用更易读的实现

这是您可以放置​​在库中或者可以将其包装在另一个Javascript框架的插件中的函数。

function inv(i) {
  if (i == 0) {
    return 1
  } else {
    return 0;
  }
}

用法很简单:

v = inv(v);

优点是:

  1. 没有代码重复
  2. 如果以后您或任何人再次阅读此书,您将在最短的时间内理解您的代码。
古一Gil2020/03/13 15:26:32

你可以做

v = Math.abs(--v);

减量Math.abs会将值设置为0或-1,然后将-1转换为+1。

泡芙小卤蛋Tom2020/03/13 15:26:32

如果它必须是整数1或0,那么尽管不需要括号,但您的操作方式也很好。如果将这些a用作布尔值,则可以执行以下操作:

v = !v;
蛋蛋TomItachi2020/03/13 15:26:32
v = v == 0 ? 1 : 0;

足够 !

理查德Stafan2020/03/13 15:26:32

通常,只要需要在两个值之间切换,就可以从两个切换值的总和中减去当前值:

    0,1 -> v = 1 - v
    1,2 -> v = 3 - v
    4,5 -> v = 9 - v 
伽罗GreenNear2020/03/13 15:26:32

解决方案清单

我想提出三种解决方案。所有这些转换为任意值0(如1true等)或1(如果0falsenull等):

  • v = 1*!v
  • v = +!v
  • v = ~~!v

and one additional, already mentioned, but clever and fast (although works only for 0s and 1s):

  • v = 1-v

Solution 1

You can use the following solution:

v = 1*!v

This will first convert the integer to the opposite boolean (0 to True and any other value to False), then will treat it as integer when multiplying by 1. As a result 0 will be converted to 1 and any other value to 0.

As a proof see this jsfiddle and provide any values you wish to test: jsfiddle.net/rH3g5/

The results are as follows:

  • -123 will convert to integer 0,
  • -10 will convert to integer 0,
  • -1 will convert to integer 0,
  • 0 will convert to integer 1,
  • 1 will convert to integer 0,
  • 2 will convert to integer 0,
  • 60 will convert to integer 0,

Solution 2

As mblase75 noted, jAndy had some other solution that works as mine:

v = +!v

It also first makes boolean from the original value, but uses + instead of 1* to convert it into integer. The result is exactly the same, but the notation is shorter.

Solution 3

The another approach is to use ~~ operator:

v = ~~!v

It is pretty uncommon and always converts to integer from boolean.

梅斯丁2020/03/13 15:26:32

v = (v + 1) % 2如果你通过更多的值需要周期只是改变2(n + 1)假设您需要循环0,1,2就可以了v = (v + 1) % 3

LEY番长2020/03/13 15:26:32

因为0是一个false价值,1是一个true价值。

v = (v ? 0 : 1);

如果您乐于使用truefalse不是数字

v = !v;

或者它们必须是数字:

v = +!v; /* Boolean invert v then cast back to a Number */
达蒙小胖2020/03/13 15:26:32

如果您不关心除1以外的任何可能性:

v = v ? 0 : 1;

在上述情况下,如果v为0,false,undefined或null,则v最终将为1。使用这种方法要小心-即使v是“ hello world”,v也会为0。

西门泡芙Jim2020/03/13 15:26:32

您可以为此编写一个函数,并像下面这样使用它:

v = inv(v)

用户70493023002020/03/13 15:26:32

您可以简单地使用:

v = 1 - v;

当然,这假定变量已正确初始化,即变量值仅为0或1。

另一种较短但使用较少通用运算符的方法:

v ^= 1;

编辑:

要清楚;我从来没有以代码高尔夫的方式来解决这个问题,只是找到了一种完成任务的简短方法而没有使用任何晦涩的技巧,例如操作员的副作用。

Sam神乐番长2020/03/13 15:26:32

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

取而代之的是具有类似功能的功能v = toggle(v),以便尽早传达意图。