我有一个值的对象来构建一个位掩码(原谅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确实不怕隐含转换。我将这些位组合在一起似乎很奇怪,但这些位与值实际存储在内存中的方式完全不同。我显然遗漏了一些东西。
答案 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