У меня есть объект значений для создания битовой маски из (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 наверняка не боится неявных преобразований. Мне просто кажется странным, что я объединяю биты здесь, но эти биты полностью отличаются от того, как значения фактически хранятся в памяти. Мне явно чего-то не хватает.
Итак, что, если, предположительно, вы хотели сделать поразрядную операцию над представлением с плавающей запятой? Казалось бы, вы не можете? –
Я не думаю, что это было бы возможно. И почему вы хотите этого? – TheHippo
Хороший вопрос. Я не знаю, я никогда раньше не делал двоичный материал. Просто чувствую это. –