我想在0和1之间切换变量。如果它是0,我想将其设置为1,否则,如果它是1,我想将其设置为0。
这是一个非常基本的操作,我经常写这本书,希望研究出最短,最清晰的方法。到目前为止,这是我最好的:
v = (v == 0 ? 1 : 0);
您可以对此进行改进吗?
编辑:问题是询问如何用最少的字符写以上语句,同时保持清晰度-这是“不是一个真正的问题”吗?这样做并非旨在进行代码高尔夫练习,尽管人们从高尔夫运动中获得了一些有趣的答案-很高兴看到高尔夫以建设性和发人深省的方式使用。
我想在0和1之间切换变量。如果它是0,我想将其设置为1,否则,如果它是1,我想将其设置为0。
这是一个非常基本的操作,我经常写这本书,希望研究出最短,最清晰的方法。到目前为止,这是我最好的:
v = (v == 0 ? 1 : 0);
您可以对此进行改进吗?
编辑:问题是询问如何用最少的字符写以上语句,同时保持清晰度-这是“不是一个真正的问题”吗?这样做并非旨在进行代码高尔夫练习,尽管人们从高尔夫运动中获得了一些有趣的答案-很高兴看到高尔夫以建设性和发人深省的方式使用。
v =数字(!v)
它将把转换后的布尔值类型转换为Number,这是所需的输出。
v=!v;
将适用于v = 0和v = 1;并切换状态;
如果只有两个值,例如在这种情况下(0,1),我相信使用int是浪费的。而是去布尔值并逐位工作。我知道我在假设,但是在两个状态之间切换的情况下,布尔值似乎是理想的选择。
未经测试,但是如果您想使用布尔值,我认为var v = !v可以。
参考:http://www.jackfranklin.co.uk/blog/2011/05/a-better-way-to-reverse-variables
v等于任何值的另一种创造性的实现方式将始终返回0或1
v = !!v^1;
定义一个数组{1,0},将v设置为v [v],因此v的值为0变为1,反之亦然。
如果确定输入为1或0,则可以使用:
v = 2+~v;
如果v的可能值只有0和1,则对于任何整数x,表达式为:v = Math.pow((Math.pow(x,v)-x),v); 将切换值。
我知道这是一个丑陋的解决方案,OP并没有在寻找这个...但是当我在厕所时,我只是在考虑另一种解决方案:P
多一个:
v=++v%2
(在C语言中,这很简单++v%=2)
ps。是的,我知道这是双重赋值,但这只是C方法的原始重写(按原样工作,因为JS预增量运算符未返回左值)。
由于这是JavaScript,因此我们可以使用一元+转换为int:
v = +!v;
这将使(给出if 或if )NOT的值符合逻辑。然后,我们将返回的布尔值转换为其相应的整数表示形式。vtruev == 0falsev == 1
仅用于踢球:v = Math.pow(v-1,v)也在1和0之间切换。
我不知道您为什么要建立自己的布尔值?我喜欢时髦的语法,但是为什么不编写可理解的代码呢?
这不是最短/最快的,但最清晰(所有人都可读)的是使用众所周知的if / else状态:
if (v === 0)
{
v = 1;
}
else
{
v = 0;
}
如果您想弄清楚,应该为此使用布尔值而不是数字。在大多数情况下,它们足够快。使用布尔值时,您可以只使用以下语法,这将在短时间内获胜:
v = !v;
原始解决方案的另一种形式:
v = Number(v == 0);
编辑:感谢TehShrike和Guffa指出我原始解决方案中的错误。
另一种方法是:
v = ~(v|-v) >>> 31;
我将使其更加明确。
什么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);
为了总结另一个答案,评论和我自己的观点,我建议结合以下两点:
这是您可以放置在库中或者可以将其包装在另一个Javascript框架的插件中的函数。
function inv(i) {
if (i == 0) {
return 1
} else {
return 0;
}
}
用法很简单:
v = inv(v);
优点是:
你可以做
v = Math.abs(--v);
减量Math.abs会将值设置为0或-1,然后将-1转换为+1。
如果它必须是整数1或0,那么尽管不需要括号,但您的操作方式也很好。如果将这些a用作布尔值,则可以执行以下操作:
v = !v;
v = v == 0 ? 1 : 0;
足够 !
通常,只要需要在两个值之间切换,就可以从两个切换值的总和中减去当前值:
0,1 -> v = 1 - v 1,2 -> v = 3 - v 4,5 -> v = 9 - v
我想提出三种解决方案。所有这些转换为任意值0(如1,true等)或1(如果0,false,null等):
v = 1*!vv = +!vv = ~~!vand one additional, already mentioned, but clever and fast (although works only for 0s and 1s):
v = 1-vYou 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,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.
The another approach is to use ~~ operator:
v = ~~!v
It is pretty uncommon and always converts to integer from boolean.
v = (v + 1) % 2如果你通过更多的值需要周期只是改变2了(n + 1)。假设您需要循环0,1,2就可以了v = (v + 1) % 3。
因为0是一个false价值,1是一个true价值。
v = (v ? 0 : 1);
如果您乐于使用true而false不是数字
v = !v;
或者它们必须是数字:
v = +!v; /* Boolean invert v then cast back to a Number */
如果您不关心除1以外的任何可能性:
v = v ? 0 : 1;
在上述情况下,如果v为0,false,undefined或null,则v最终将为1。使用这种方法要小心-即使v是“ hello world”,v也会为0。
您可以为此编写一个函数,并像下面这样使用它:
v = inv(v)
您可以简单地使用:
v = 1 - v;
当然,这假定变量已正确初始化,即变量值仅为0或1。
另一种较短但使用较少通用运算符的方法:
v ^= 1;
要清楚;我从来没有以代码高尔夫的方式来解决这个问题,只是找到了一种完成任务的简短方法而没有使用任何晦涩的技巧,例如操作员的副作用。
像v = 1 - v,或v ^= 1或v= +!v这样的代码行都可以完成工作,但是它们构成了我称为hack的内容。这些不是漂亮的代码行,而是可以达到预期效果的廉价技巧。1 - v不传达“在0和1之间切换值”。这使您的代码表达能力降低,并引入了一个地方(尽管很小),另一个开发人员将不得不解析您的代码。
取而代之的是具有类似功能的功能v = toggle(v),以便尽早传达意图。
好吧,众所周知,在javascript中,布尔比较也将为您提供预期的结果。
即
v = v == 0足够了。以下是该代码:
JSFiddle:https ://jsfiddle.net/vikash2402/83zf2zz0/
希望这对您有帮助:)