【问题标题】:Manipulating binary values in JavaScript, some confusion在 JavaScript 中操作二进制值,有些混乱
【发布时间】: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


    【解决方案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

    【讨论】:

    • 那么,假设您想对浮点表示进行按位运算怎么办?好像不行?
    • 我认为这是不可能的。还有你为什么要这样做?
    • 好问题。我不知道,我以前从未真正做过二进制的东西。只是感觉出来。
    猜你喜欢
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多