2017-06-19 108 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