2014-01-20 2 views
1

У меня есть объект значений для создания битовой маски из (pardon the 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 в бинарном:

01000000 00010000 00000000 00000000 00000000 00000000 00000000 00000000 

Не это значение указано в моем комментарии выше:

00000100 

И все же работа битовых операторов, как если бы это было 00000010 ,

Я знаю, что JavaScript наверняка не боится неявных преобразований. Мне просто кажется странным, что я объединяю биты здесь, но эти биты полностью отличаются от того, как значения фактически хранятся в памяти. Мне явно чего-то не хватает.

ответ

1

Я не 100% уверен в этом, но мне кажется, что битовые операции делают выполнить приведение к целому числу внутренне:

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

Edit: Казаться подтверждается этот вопрос - using bitwise OR in javascript to convert to integer

+0

Итак, что, если, предположительно, вы хотели сделать поразрядную операцию над представлением с плавающей запятой? Казалось бы, вы не можете? –

+0

Я не думаю, что это было бы возможно. И почему вы хотите этого? – TheHippo

+0

Хороший вопрос. Я не знаю, я никогда раньше не делал двоичный материал. Просто чувствую это. –

Смежные вопросы