我想在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
的值符合逻辑。然后,我们将返回的布尔值转换为其相应的整数表示形式。v
true
v == 0
false
v == 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*!v
v = +!v
v = ~~!v
and one additional, already mentioned, but clever and fast (although works only for 0
s and 1
s):
v = 1-v
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
,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/
希望这对您有帮助:)