2014-01-20 25 views
1

我有一個值的對象來構建一個位掩碼(赦免CoffeeScript)。在JavaScript中操作二進制值,一些混淆

flags: 
    segment: 1 # 00000001 
    tatum: 2 # 00000010 
    beat:  4 # 00000100 
    bar:  8 # 00001000 
    section: 16 # 00010000 

現在我按照以下方式構建一個字節,使用按位或來設置特定的位。

byte = 0 

byte = byte | flags.segment if data.segment 
byte = byte | flags.tatum if data.tatum 
byte = byte | flags.beat if data.beat 
byte = byte | flags.bar  if data.bar 
byte = byte | flags.section if data.section 

@sendByte(byte) 

但問題是,爲什麼這樣工作?

我知道JavaScript將數字存儲爲雙精度浮點數。因此,這些數字的二進制表示不像一個簡單的二進制整數,對嗎?那麼,按位OR |運算符以某種方式隱式轉換操作數?

例如,雙4,二進制,是:

00000100 

可是位運算符的工作,如果它是00000010

01000000 00010000 00000000 00000000 00000000 00000000 00000000 00000000 

不是這上面我的評論指出值。

我知道JavaScript確實不怕隱式轉換。這似乎很奇怪,我將這些位合併在一起,但這些位與實際存儲在內存中的方式完全不同。我顯然缺少一些東西。

回答

1

我不是100%肯定這一點,但似乎位運算符做執行強制轉換爲內部整數

2 | 1 
>> 3 
2.6 | 1 
>> 3 
3 & 1 
>> 1 
3.2 & 1 
>> 1 

編輯:似乎被這一問題得到證實 - using bitwise OR in javascript to convert to integer

+0

那麼,假設你想對浮點表示做一個按位運算呢?這似乎你不能? –

+0

我不認爲這是可能的。另外你爲什麼要這樣? – TheHippo

+0

好問題。我不知道,我從來沒有真正做過二進制的東西。只是感覺到了。 –