在JavaScript中操纵二进制值,有些困惑

时间:2014-01-20 18:37:15

标签: javascript coffeescript binary bit-manipulation bitmask

我有一个值的对象来构建一个位掩码(原谅CoffeeScript)。

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

现在我按以下方式构造一个字节,使用按位OR来设置特定位。

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 个答案:

答案 0 :(得分: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