2017-06-19 71 views
0

我想对一个值应用按位运算,如果该值为0则将其变为0;如果该值大于零,则将其变为1。按位运算得到1 if> 0 else 0

具体来说,我想在JavaScript中soultion,围绕Number(Boolean(value))

0 -> 0 
1 -> 1 
2 -> 1 
3 -> 1 
4 -> 1 
... 

办法,我可以为位操作实现这一目标?算术运算也不错。

+0

是否允许算术或逻辑运算符(例如'+'或'!'),还是仅需严格按位运算符? –

+0

算术会很好。 本质上我想要一个更有说服力的方法Number(布尔(值)) – Strernd

+0

已经很好的答案,只是为了好玩:'1-!x''也应该诀窍 –

回答

4

!!x是这样做的惯用方式,对于整数类型(包括布尔值)x

+0

虽然不是按位('!'是逻辑运算符)。 –

+1

的确,我认为这是“用户不太清楚他们想要的”情况。我太老了,不能使用〜和^。 – Bathsheba

+0

你可能是对的 - 我已经要求澄清评论。 –

2

x && 1这样做。

for(x=0; x<5; x++) { 
    console.log(x & 1) 
} 

写入:

0 
1 
1 
1 
1 

这是一个逻辑AND但JavaScript的类型规则似乎保持数字结果。


但是你应该考虑有多少JS编码器会直觉地理解这一点。

宁愿可读性,以简洁,我会亲自使用三元运算:

x == 0 ? 0 : 1 

...尽管你问,以避免选项也非常清晰:

Number(Boolean(x)) 

你似乎暗示这可能比替代方案慢。

  1. 我看不出为什么这会很慢。 NumberBoolean是语言内置程序,它可以执行非常简单的操作,我们预计会非常便宜
  2. 不成熟的优化是万恶之源。如果您的代码运行速度缓慢得令人无法接受,那么您只应该担心这种微型优化。如果在循环中运行数百万次,该操作只会产生这样的效果。如果是这种情况,只要尝试一下,你就可以轻易地判断出另一种方案是否便宜。

请注意,您的要求:

把它转化为0,如果值是0,或者如果它大于零

转1 ...做如果x为负值,则不指定要发生的情况。这个答案可以让你相应地调整。

+0

我只是好奇,如果这种方法会比使用快如果或铸造。 – Strernd

+0

@Strernd都很快。除非您遇到缓慢问题,并且会导致可衡量的改进,否则不要针对速度进行优化。 – slim

+0

@使者@当然不可读。 – Strernd