【发布时间】:2014-02-10 01:43:39
【问题描述】:
我有一个值对象来构建位掩码(请原谅 CoffeeScript)。
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 肯定不怕隐式转换。我在这里组合这些位似乎很奇怪,但这些位与值实际存储在内存中的方式完全不同。我显然错过了一些东西。
【问题讨论】:
标签: javascript coffeescript binary bit-manipulation bitmask